Посмотрите на этот код в getRawData()
, сначала вы читаете файл, чтобы определить общее количество строк:
while(!feof(outtput))
{
ch = fgetc(outtput);
if(ch == '\n')
.....
.....
, из-за этого указатель потока файла указывает на EOF
, а после этого вцикл for
, который вы выполняете:
for(i = 0; i < nmemb; i++) {
fscanf(outtput, "%s %s %s", records[i].f_name, records[i].s_name, records[i].ID);
.....
.....
Здесь fscanf()
должен возвращать EOF
, так как не осталось ничего для чтения из файла потока.Вы должны проверить возвращаемое значение fscanf()
во время чтения файла.
Вы должны сбросить указатель на начало файла, прежде чем читать его снова.Вы можете использовать либо rewind(ptr)
, либо fseek(fptr, 0, SEEK_SET)
.Ниже приведен пример программы, которая покажет вам, что происходит в вашем коде и как работает решение:
#include <stdio.h>
int main (void) {
int ch;
int lines = 0;
char str[100];
FILE *fptr = fopen ("file.txt", "r");
if (fptr == NULL) {
fprintf (stderr, "Failed to open file");
return -1;
}
while (!feof(fptr)) {
ch = fgetc (fptr);
if(ch == '\n') {
lines++;
}
}
printf ("Number of lines in file: %d\n", lines);
printf ("ch : %d\n", ch);
printf ("Now try to read file using fscanf()\n");
ch = fscanf (fptr, "%s", str);
printf ("fscanf() return value, ch : %d\n", ch);
printf ("Resetting the file pointer to the start of file\n");
rewind (fptr); // This will reset the pointer to the start of file
printf ("Reading file..\n");
while ((ch = fscanf (fptr, "%s", str)) == 1) {
printf ("%s", str);
}
printf ("\nch : %d\n", ch);
fclose (fptr);
return 0;
}
Содержание чтения файла в вышеуказанной программе:
Hello Vilho..
How are you!
Вывод:
Number of lines in file: 2
ch : -1
Now try to read file using fscanf()
fscanf() return value, ch : -1
Resetting the file pointer to the start of file
Reading file..
HelloVilho..Howareyou!
ch : -1
Здесь вы можете видеть, что первые ch : -1
указывают на то, что указатель файла находится на EOF
, и если вы попытаетесь прочитать, вы получите EOF
, потому что больше нечего читать.После сброса указателя файла вы можете увидеть, что fscanf()
может читать файл.
Не следует использовать while (!feof(file))
.Проверьте это .