我必须制作一个用C语言编写的程序,它将读取并打印出文本文件中的某些内容。
但是以下程序的2个功能由于某种原因不能工作。案例3工作正常。但是其他2个没有打印或只有1个名字。这怎么可能,我该如何解决这个问题。
我没有得到任何错误。
#include <stdio.h>
main()
{
FILE *list;
int number, menu, total;
char name[20];
list = fopen("C:\\PATH\\TO\\FILE", "r");
printf("Menu: \n"\n);
printf("[1] Positive total: \n");
printf("[2] Negative total: \n");
printf("[3] Total: \n");
printf("[4] Quit \n\n");
printf("Choose: 1,2,3 or 4:\n");
scanf("%d", &menu);
while (menu!=4)
{
fscanf(list, "%d%s%d", &number, name, &total);
switch(menu)
{
case 1: printf("Negative total \n");
while(!feof(list))
{
if (total<0)
{
printf("-%6d%-15s%6d\n", number, name , total);
fscanf(list, "%d%s%d", &number, name, &total);
}
}
break;
case 2: printf("Positive: \n");
while(!feof(list))
{
if (total>=0)
{
printf("-%6d%15s%6d\n", number, name , total);
fscanf(list, "%d%s%d", &number, name, &total);
}
}
break;
case 3: printf("Total: \n");
while(!feof(list))
{
printf("-%6d%15s%6d\n", number, name , total);
fscanf(list, "%d%s%d", &number, name, &total);
}
break;
}
rewind(list);
printf("\nChoose again, 1, 2, 3, 4: ");
scanf("%d", &menu);
}
printf("End of Program");
fclose(list);
return 0;
}
文本文件由数字,名称,总金额组成(您可以将其视为银行系统)。这是文本文件:
5892 John +7250
5893 Kate -94
5894 Mike +324
5895 Jack +9570
5896 Anne +800
答案 0 :(得分:0)
在案例1和2中都有无限循环条件。在案例1中,这个:
if (total<0)
{
printf("-%6d%-15s%6d\n", number, name , total);
fscanf(list, "%d%s%d", &number, name, &total);
}
应该是:
if (total<0)
{
printf("-%6d%15s%6d\n", number, name , total);
}
fscanf(list, "%d%s%d", &number, name, &total);
否则,每次读取正金额时你都会被卡住:总计将>&gt; = 0,所以你不输入if块,你永远不会执行fscanf()调用继续阅读文件。循环期望到达文件末尾,但是你永远不会到达它,因为你没有向前看,你刚刚停止。
情况2也是如此:你必须在if块之外调用scanf,如下所示:
if (total>=0)
{
printf("-%6d%15s%6d\n", number, name , total);
}
fscanf(list, "%d%s%d", &number, name, &total);
此外,您发布的代码不会在第11行编译(您有printf(“Menu:\ n”\ n),即字符串中有换行符。请尝试在将来提供可编译的代码
这是一个有效的版本:
#include <stdio.h>
int main()
{
FILE *list;
int number, menu, total;
char name[20];
list = fopen("example", "r");
printf("Menu: \n\n");
printf("[1] Positive total: \n");
printf("[2] Negative total: \n");
printf("[3] Total: \n");
printf("[4] Quit \n\n");
printf("Choose: 1,2,3 or 4:\n");
scanf("%d", &menu);
while (menu!=4)
{
fscanf(list, "%d%s%d", &number, name, &total);
switch(menu)
{
case 1: printf("Negative total \n");
while(!feof(list))
{
if (total<0)
{
printf("-%6d%15s%6d\n", number, name , total);
}
fscanf(list, "%d%s%d", &number, name, &total);
}
break;
case 2: printf("Positive: \n");
while(!feof(list))
{
if (total>=0)
{
printf("-%6d%15s%6d\n", number, name , total);
}
fscanf(list, "%d%s%d", &number, name, &total);
}
break;
case 3: printf("Total: \n");
while(!feof(list))
{
printf("-%6d%15s%6d\n", number, name , total);
fscanf(list, "%d%s%d", &number, name, &total);
}
break;
}
rewind(list);
printf("\nChoose again, 1, 2, 3, 4: ");
scanf("%d", &menu);
}
printf("End of Program");
fclose(list);
return 0;
}
最后一些评论:我会测试fopen()的返回值,以确保文件成功打开。您可能还想在循环条件下使用ferror()执行一些错误检查。最后,确保你的“名称”缓冲区足够大,20个字符不是很大。对于安全程序,您应该使用fgets(name,19,stdin),然后使用null终止字符串。