好吧,所以我创建了一个程序,该程序将从一些不同文件中的一行中获取内容,并对其求和,然后将求和打印到屏幕上,然后继续获取下一行,如下所示。
#include<stdio.h>
#include<conio.h>
void addscores(void);
FILE *faa;
FILE *fab;
FILE *fac;
int DataCount=0;
int total=0;
struct store3
{
int def3;
}stock3[128];
int main()
{
addscores();
}
void addscores(void)
{
do
{
total=0;
faa=fopen("Test 01 Scores.txt","r");
fscanf(faa,"%d", &stock3[DataCount].def3);
fclose(faa);
total=total+stock3[DataCount].def3;
fab=fopen("Test 02 Scores.txt","r");
fscanf(fab,"%d", &stock3[DataCount].def3);
fclose(fab);
total=total+stock3[DataCount].def3;
fac=fopen("Test 03 Scores.txt","r");
fscanf(fac,"%d", &stock3[DataCount].def3);
fclose(fac);
total=total+stock3[DataCount].def3;
printf("Total = %dn",total);
DataCount=DataCount+1;
getch();
}
while(!feof(faa));
getch();
}
然而,出现了一个问题,程序将不会读取第2、第3。。。。在完成第一个循环后,文件的第n行,因此程序将只打印第一行的相同和。
忽略无限循环(稍后可以修复)我该如何修复?
旁注:请原谅我臭名昭著地使用while(!EOF)
文件中的内容:
1
2
3
4
5
预期输出
3
6
9
12
15
实际输出
3
3
3
3
3
3
3
3
3
3
3
3
...
...
谢谢,它已修复:D
由于在每次迭代中打开和关闭文件,所以总是读取每个文件的第一行。这就是两个问题的原因:你得到了无限循环,因为你从来没有达到EOF,你总是把第一行的条目加起来。您应该在循环进入之前打开所有文件,然后关闭它们。您还应该检查是否至少有一个文件达到了EOF(而不仅仅是第一个),以在它们有不同的腿时捕获案例,并将检查移到循环的开头(如果文件为空)。
问题是关闭文件并在每次循环时重新打开它。
看看"文件描述符"和fseek函数。试着理解它。
如果你有什么问题,欢迎你!:)
正如其他人所说,只需在循环外打开/关闭一次。
faa=fopen("Test 01 Scores.txt","r");
fab=fopen("Test 02 Scores.txt","r");
fac=fopen("Test 03 Scores.txt","r");
do {
total=0;
fscanf(faa,"%d", &stock3[DataCount].def3);
total=total+stock3[DataCount].def3;
fscanf(fab,"%d", &stock3[DataCount].def3);
total=total+stock3[DataCount].def3;
fscanf(fac,"%d", &stock3[DataCount].def3);
total=total+stock3[DataCount].def3;
printf("Total = %dn",total);
DataCount=DataCount+1;
getch();
} while(!feof(faa) && !feof(ab) && !(feof(ac));
fclose(faa);
fclose(fab);
fclose(fac);
另一个问题是,只有在fa
完成后(即第一个文件),此循环才会退出。如果其他文件仍有输入,您想怎么办?它们可能都是相同的长度,但明智的做法是不要总是假设这一点。