代码之家  ›  专栏  ›  技术社区  ›  CroCo

在写入txt文件时,使用Ctrl+d和Ctrl+c终止程序有什么区别

gcc c
  •  2
  • CroCo  · 技术社区  · 5 月前

    看看这段代码,它允许用户将数据写入txt文件。

    #include <stdio.h>
    
    int main(void)
    {
       FILE *cfPtr = NULL;
    
       if ( (cfPtr = fopen("clients.txt","w")) == NULL ){
            puts("File could not be opened");
       }else{
            puts("Enter the account, name, and balance");
            puts("Enter EOF to end input.");
            printf("%s", "? ");
            int account = 0;
            char name[30] = "";
            double balance = 0.0;
            scanf("%d%29s%lf",&account,name,&balance);
            
            while (!feof(stdin)){
                fprintf(cfPtr,"%d %s %.2f\n",account,name,balance);
                printf("%s", "? ");
                scanf("%d%29s%lf",&account,name,&balance);
            }
    
            fclose(cfPtr);
       }
    }
    

    你可以用

    Enter the account, name, and balance
    Enter EOF to end input.
    ? 100 Jones 24.98
    ? 200 Doe 345.67
    ? 300 White 0.00
    ? 400 Stone -42.16
    ? 500 Rich 224.62
    

    如果我用Ctrl+d终止程序,程序运行良好,上述数据已成功写入文件。但是,如果我用Ctrl+c终止它 txt 文件。我想知道这里发生了什么。为什么程序不能立即写入正确的数据?

    编译器是 gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 .

    2 回复  |  直到 5 月前
        1
  •  4
  •   dbush    5 月前

    在终端中按CTRL-D不会终止程序。它向程序发送EOF(即关闭标准输入流) feof 功能可以检测。

    然而,按下CTRL-C会向程序发送信号。如果没有明确捕获此信号,将导致程序立即终止。

        2
  •  2
  •   Chris    5 月前

    除了dbush非常正确的解释外,请注意,可以修改此程序的行为,以便通过显式方式将输出(或至少大部分输出)写入文件 冲洗 输出与 fflush 在每次循环迭代中。执行此操作后,程序将立即输出到输出文件。就目前而言,如果你在该文件中没有看到任何输出,这几乎肯定意味着你的系统正在努力提高效率,在看到足够的数据或关闭之前不会刷新流。两者都不会因为Ctrl-C而发生。

    我还建议 else 没有必要。

    #include <stdio.h>
    
    int main(void) {
        FILE *cfPtr = NULL;
    
        if ((cfPtr = fopen("clients.txt","w")) == NULL) {
            puts("File could not be opened");
            return 1;
        }
    
        puts("Enter the account, name, and balance");
        puts("Enter EOF to end input.");
        printf("%s", "? ");
        int account = 0;
        char name[30] = "";
        double balance = 0.0;
        scanf("%d%29s%lf", &account, name, &balance);
            
        while (!feof(stdin)) {
            fprintf(cfPtr,"%d %s %.2f\n", account, name, balance);
            fflush(cfPtr);
            printf("%s", "? ");
            scanf("%d%29s%lf", &account, name, &balance);
        }
    
        fclose(cfPtr);
    }
    

    进一步注意:确保检查返回值 scanf 调用作为验证输入的手段。验证还有更多,但这只是一个开始。

    你也可以构建你的循环,这样你就不必重复自己了。