5

printfコンソールではなくファイルに文字列を出力するために変更する方法はありますか?

dupインターネットで何かを調べてみたところ、のような呼び出しが見つかりました。これはこれに関連しdup2fflushいる可能性があります。

編集:

多分私は明確ではなかった..問題は、これがC試験の問題であったということです..問題は次のとおりです。

通常は ( を使用して) 文字列を画面に出力するプログラムを、上記のプログラムのコードを変更せずprintf()にファイルに出力する方法を説明してください。

4

6 に答える 6

11

印刷を行うソース コードを変更する自由がない場合は、freopenonを使用しstdoutてファイルにリダイレクトできます。

stdout = freopen("my_log.txt", "w", stdout);

ただし、コマンドラインのリダイレクトが期待どおりに機能しなくなるため、これはハッキングに近いものです。印刷を行うコードにアクセスできる場合は、使用することをお勧めしますfprintf

stdout関数呼び出しのために一時的に切り替えてから元に戻すこともできます。

FILE *saved = stdout;
stdout = fopen("log.txt", "a");
call_function_that_prints_to_stdout();
fclose(stdout);
stdout = saved;
于 2012-06-08T10:50:19.320 に答える
6

これは通常、I/O リダイレクション (... >file) で行われます。

この小さなプログラムをチェックしてください:

#include <stdio.h>
#include <unistd.h>

int main (int argc, char *argv[]) {
    if (isatty (fileno (stdout)))
        fprintf (stderr, "output goes to terminal\n");
    else
        fprintf (stderr, "output goes to file\n");

    return 0;
}

ottj@NBL3-AEY55:~ $ ./x
output goes to terminal
ottj@NBL3-AEY55:~ $ ./x >yy
output goes to file
于 2012-06-08T11:02:50.750 に答える
3

他の回答は、コードを変更しないという問題に対処していません。

したがって、環境によっては、プログラムを呼び出すときの stdout リダイレクトだけが残ります。

./program > target_file
于 2012-06-08T11:01:47.253 に答える
2

講師に相談したところ、これが (講師自身によって) 提供された正しい解決策でした。

int main {
    int newFile = open(desiredFilePath, O_WRONLY)
    if ((fork())==0) {
        dup2(newFile,stdout) // Explained below
        close newFile
        Set stdout as CLOSE_ON_EXEC false
        exec the user program
    }
    else{
        Wait for child
    }
    return 0
}

dup2 の背後にあるロジック: ここで、stdout は newFile のコピーとして設定されます。つまり、FD 0 は実際にはユーザーが必要とするファイルであり、コンソールではありません。これは、dup 2 のデフォルトの動作が、2 番目のパラメーターのファイル記述子を閉じて、最初のパラメーターに割り当てるためです。

于 2013-06-08T10:00:22.673 に答える
1

sprintf文字列に書き込んでからファイルに書き込むか、fprintf直接書き込むために使用します。

http://linux.die.net/man/3/fprintf

于 2012-06-08T10:44:55.180 に答える
0

ファイルはバッファを使用するためfflush(STDOUT_FILENO)、printf の後に使用するだけです

于 2021-08-20T05:37:04.410 に答える