如果我的程序通过CTRL-C终止,为什么使用fprintf输出的字符串最终没有写入输出文件?

Pau*_*hen 3 c file-io printf

为什么fprintf在以下示例程序中给出不同的结果?

例1:

int main(){
    FILE *f;
    char buf[512];
    char name[128] = {"filename"};

    f = fopen(name, "w");
    fprintf(f, "asdas\n");
    fprintf(f, "asdas\n");
    while(1){}
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用CTRL+ 终止此程序C,我会得到一个名为的文件filename.

但是,使用

例2:

int main(){
    FILE *f;
    char buf[512];
    char name[128] = {"wpa_supplicant.conf"};

    f = fopen(name,"w");
    while(1){
        fprintf(f, "asdas\n");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用CTRL+ 终止这个程序C,我得到文件命名filename,它包含许多带字符串的行asdas.

为什么在第一个示例中字符串没有写入文件,但是在第二个示例中它们被写入文件?

Sin*_*nür 5

在第二种情况下,有足够的fprintf调用将内部缓冲区刷新到磁盘.

对于第一个程序,如果fflush(f)while循环之前放置一个,则字符串将被写入文件.

#include <stdio.h>

int main(void) {
    FILE *f = fopen("filename", "w");
    if (!f) {
        perror("Failed to open 'filename' for writing");
        exit(EXIT_FAILURE);
    }

    fprintf(f, "asdas\n");
    fprintf(f, "asdas\n");

    if ( fflush(f) != 0 ) {
        perror("Flushing output failed");
        exit(EXIT_FAILURE);
    }

    while(1){}
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

C:\...\Temp> cl file.c                       
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.31101 for x64
...
/out:file.exe                                                      

C:\...\Temp> file                            
^C                                                                 
C:\...\Temp> type filename                   
asdas                                                              
asdas

记住:

成功完成后,fflush()应返回0; 否则,它应设置流的错误指示,返回EOF,并设置errno为指示错误.