Непонятная работа 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];
Объяснение кода листинга программы
- Объявляется массив
flightnumтипаcharс размером 6 элементов.