C中的文件处理;不接受输入

时间:2015-06-29 21:49:16

标签: c file loops input

我开始学习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;
}

1 个答案:

答案 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()替换为,,因为在某些区域设置;是小数点分隔符,它只是如果确保,是小数点分隔符,则可以使用它。