我开始学习C中的文件处理。这个特定程序的目的是创建一个名为“clients.dat”的文件,在那里我存储银行的帐号,姓名和客户余额,让我们说。我已经工作和改进了代码,使其成为教科书提供的完美复制品的一个例子,但由于某种原因,我在第一次“scanf”之后无休止地循环,并重新打印问号而忘记了,而没有将它写入scanf while循环中的语句。有人会对为什么会这样做有任何建议吗?我的编译器是Netbeans,我在Linux-Ubuntu上运行它。
#include <stdio.h>
#include <stdlib.h>
/*
*
*/
int main() {
unsigned int actNumber;
char actName[30];
long double actBalance;
FILE *fPtr;
if((fPtr = fopen("clients.dat", "w")) == NULL) {
printf("File could not be found.\n");
}
else {
printf("Enter the Account Number, Name, and Balance.\n Hit the EoF to exit.\n");
printf("%s","?");
scanf("%d%29s%lf", &actNumber, actName, &actBalance);
while (!feof(stdin)) {
fprintf(fPtr, "%d, %29s, %.2lf\n", actNumber, actName, actBalance);
printf("%s", "?");
scanf("%d%29s%lf", &actNumber, actName, &actBalance);
}
fclose(fPtr);
}
return;
}
答案 0 :(得分:2)
仅当您在控制台上按特殊组合键时,文件结束标记才会设置在stdin
上。
您可以使用scanf()
的返回值使您的循环正常工作,就像这样
while (scanf("%d%29s%lf", &actNumber, actName, &actBalance) == 3)
{
fprintf(fPtr, "%d, %29s, %.2lf\n", actNumber, actName, actBalance);
printf("%s", "?");
}
在输入流中保留第一个scanf()
'\n'
字符后,当您在循环内再次调用scanf()
时,字符将被消耗然后被忽略,{{1}如果返回的值小于3,则会反复重复该过程,从而导致无限循环。
然而,以下解决方案更好。使用scanf()
可以更好地处理fgets()
中未读取的'\n'
字符,
stdin
请注意,我删除了char line[100];
while (fgets(line, sizeof(line), stdin) != NULL)
{
if (sscanf(line, "%d%29s%lf", &actNumber, actName, &actBalance) != 3)
continue;
fprintf(fPtr, "%d;%29s;%.2lf\n", actNumber, actName, actBalance);
fprintf(stdout, "?");
}
格式的空格,并将printf()
替换为,
,因为在某些区域设置;
是小数点分隔符,它只是如果确保,
是小数点分隔符,则可以使用它。