Непонятная работа 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 элементов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д