Непонятная работа fgets и/или fwrite(запись в бинарный файл) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Не могу разобраться, в чем дело: Программа читает данные из файла "data.txt"(во вложении), записывает их в структуру, из структуры записывает в бинарный файл "binfile.out". Проблема: Запись идет 14 раз(это можно увидеть после выполнения цикла while) == удвоенное кол-во строк в файле. Почему происходит именно так - непонятно. Функция fgets заканчивает работу по принципу - либо конец строки, либо конец длины считываемого. А как она дальше перемещается и что считывает - вот здесь ничего толкового я не нашел. Решил проблему таким образом:
if (i%2==0)
fwrite(&tt, sizeof(tt), 1, fout);
Но все-таки хотелось бы узнать, в чем причина?
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#define N 7
 
struct aero {
char destination[30]; // место назначения
char flighttype[11];  // тип самолета
int flightnum;        // номер рейса
} mm[N],tt;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Russian");
    FILE *fin, *fout;
    const int length=51; // string length
    char s[length],tmp[10];
    fin = fopen("data.txt","r"); // r = read, w = write;
    if (!fin) {printf("Ошибка открытия фаила(input)"); _getch(); return -1;}
    fout = fopen("binfile.out","w+b");
    if (!fout) {printf("Ошибка открытия фаила(output)"); _getch(); return -1;}
    int i=0;        
        for(;fgets(s,sizeof(s),fin);i++){
        strncpy(tt.destination,&s[0],29);
        strncpy(tt.flighttype,&s[29],11);
        tt.flightnum=atoi(&s[40]);
        fwrite(&tt, sizeof(tt), 1, fout);
        }
    printf("\ni=%d\n",i);
    fclose(fin);
    scanf("%i",&i);
    //fseek(fout, sizeof(tt)*2*i, SEEK_SET); // отображение нормальное
    fseek(fout, sizeof(tt)*i, SEEK_SET);
    fread(&tt, sizeof(tt), 1, fout);
    printf("%s%s%d\n",tt.destination,tt.flighttype,tt.flightnum);
    fclose(fout);
    _getch();
    return 0;
}

Решение задачи: «Непонятная работа fgets и/или fwrite(запись в бинарный файл)»

textual
Листинг программы
char flightnum[6];

Объяснение кода листинга программы

  1. Объявляется массив flightnum типа char с размером 6 элементов.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5