2

stdoutをファイルにリダイレクトしてから、Cで元のファイルに復元しようとしていますが、次の奇妙な問題に直面しています。次のコードは
in stdout
in stdout
、stdoutとin fileそれぞれのファイルに正常に書き込まれます。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define STDOUT 1
int main(int argc, char* argv[]){
    printf("in stdout \n");
    int old_out = dup(STDOUT);
    close(STDOUT);
    int fd = open("./redirected",O_CREAT|O_RDWR|O_TRUNC,0777);
    printf("in file \n");
    close(fd);
    dup(old_out);
    printf("in stdout\n");
    return EXIT_SUCCESS;
}

ただし、メイン関数の最初の行を削除します。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define STDOUT 1
int main(int argc, char* argv[]){
    int old_out = dup(STDOUT);
    close(STDOUT);
    int fd = open("./redirected",O_CREAT|O_RDWR|O_TRUNC,0777);
    printf("in file \n");
    close(fd);
    dup(old_out);
    printf("in stdout\n");
    return EXIT_SUCCESS;
}

stdout in file
in stdout
に書き込まれ、ファイルには何も書き込まれません。これはどうして起こったのだろうか?助けてくれてありがとう。

4

1 に答える 1

4

これはバッファリングの問題です。「ファイル内」に書き込んだバッファは、stdoutが再インストールされる前にフラッシュされないため、出力はファイルではなくstdoutに送られます。ここfflush(stdout);で修正しました。

于 2012-01-08T17:12:36.540 に答える