我正在尝试将文本文件读取到结构数组中,但是在尝试打印该数组时,该结构为空。打印功能工作正常,我认为问题出在getRawData中。
'1','0','0','1'
'1001'
struct student
{
char ID[MAXID + 1];
char f_name[FIRST_NAME_LENGTH + 1];
char s_name[LAST_NAME_LENGTH + 1];
int points[MAXROUNDS];
};
所以我的目标是从文件中获取数据并将其写入struct数组中存储的任何内容。我已经为此工作了太久了,希望能有所帮助。
答案 0 :(得分:2)
看看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))
。选中this。