stdout FILE * です 標準出力ストリームのポインタ。 dup2 ファイル記述子が必要です。また、パラメータの順序を台無しにしました。使用
dup2(file, 1);
この部分を行うためのより良い方法について。おそらくこの system の後に標準出力を復元したいので、この方法は悪いです コールが完了します。これはさまざまな方法で行うことができます。 dupできます どこかで dup2 それを元に戻します (そして dup を閉じます) ペッドワン)。個人的に cat を自分で書くのは好きではありません 他の回答で提案されている実装。 system を使用して単一のシェル コマンドをリダイレクトすることだけが必要な場合 ファイルシステム内のファイルに、おそらく最も直接的で簡単な方法は、これを行うシェルコマンドを作成することです
system("ls -l > Result");
ただし、ユーザーが 'Result; rm -rf /*' のようなものを指定できるため、ファイル名 (結果) がユーザー入力からのものである場合は注意が必要です。
また、セキュリティのトピックについては、ls へのフル パスを指定することを検討する必要があります。 コメントで提案されているとおり:
system("/bin/ls -l > Result");
簡単なのは > を使うことです 確かに:
#include <stdio.h>
int main()
{
system("ls -l > /some/file");
return 0;
}
別の方法は popen() を使用することです 、
#include <stdio.h>
#include <stdlib.h>
main()
{
char *cmd = "ls -l";
char buf[BUFSIZ];
FILE *ptr, *file;
file = fopen("/some/file", "w");
if (!file) abort();
if ((ptr = popen(cmd, "r")) != NULL) {
while (fgets(buf, BUFSIZ, ptr) != NULL)
fprintf(file, "%s", buf);
pclose(ptr);
}
fclose(file);
return 0;
}
popen() を使用する必要があります ライブラリ関数を呼び出し、返された FILE * からデータのチャンクを読み取ります 好きな出力ファイルに書き込んでください。
参照。