gpt4 book ai didi

c - 如何将文件读入结构数组?

转载 作者:太空宇宙 更新时间:2023-11-04 07:47:52 24 4
gpt4 key购买 nike

我试图将文本文件读入结构数组,但在尝试打印数组时,结构为空。打印功能工作正常,我认为问题出在 getRawData 中。

struct student
{
char ID[MAXID + 1];
char f_name[FIRST_NAME_LENGTH + 1];
char s_name[LAST_NAME_LENGTH + 1];
int points[MAXROUNDS];
};

//main//

case 'W':
if(save(array, len) == 0);
{
printf("Data saved.\n");
}
break;
case 'O':
if(getRawData(array, len));
{
printf("File read.\n");
}
break;

int save(struct student *h, int num_students)
{
char name[20];
printf("Enter file name: " );
scanf("%s", name); // Read in filename
FILE *output = fopen(name, "w"); // open the file to write
if (!output) {
return -1; // error
}
for (int i = 0; i < num_students; ++i)
{
fprintf(output, "%s %s %s \n", h[i].f_name, h[i].s_name, h[i].ID);
for(int j = 0; j < MAXROUNDS; j++)
{

fprintf(output, "%d\n", h[i].points[j]);
}
printf("Information of student %s %s (%s) written into file %s\n", h[i].s_name, h[i].f_name, h[i].ID, name);

}
fclose(output); // close
return 0;
}
int getRawData(struct student *records)
{
int i;
int nmemb; // amount of structs
char name[20];
printf("Name of the file to be opened: \n");
scanf("%s", name);
FILE *outtput = fopen(name, "r");
int ch=0;
int lines=0;

if (outtput == NULL);
return 0;

lines++;
while(!feof(outtput))
{
ch = fgetc(outtput);
if(ch == '\n')
{
lines++;
}
}
nmemb = lines / 7;
for(i = 0; i < nmemb; i++) {
fscanf(outtput, "%s %s %s", records[i].f_name, records[i].s_name, records[i].ID);
for(int j = 0; j < MAXROUNDS; j++)
{

fscanf(outtput, "%d\n", &records[i].points[j]);
}
}
printf("%d", lines);
return i;
}

所以我的目标是从文件中获取数据并将其覆盖存储在结构数组中的任何内容。我将不胜感激一些帮助,因为我已经为此工作了太久。

最佳答案

查看 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 .

关于c - 如何将文件读入结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55779299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com