2

関数 popen を使用して stdout を再割り当てするプログラムが printf 関数で失敗することに気付きました

コード:

# include <stdio.h>
int main(int argc, char * argv[])
{
  FILE * tmp = stdout;
  char * command = "cat > newfile.txt";
  double a=12.2344;

  stdout = popen( command, "w"); /* permitted according to glibc tutorial */

  printf("That was laddy\n");  /* This doesn't go to newfile.txt !!!*/

  fprintf(stdout, "And his lass\n"); /* but This goes */


  /* but this...... */
  printf("A double number: %.2f\n", a); /* unexpectedly goes where the
                   first printf hasn't gone */

  /* is it a bug or there is something wrong in a code ? */

  pclose(stdout);

  stdout = tmp;

  return 0;

}

関数printfとは何ですか?一度は tty に出力されますが、次回はファイル 'newfile.txt' (本来あるべき場所) に出力されます。glibc のバグですか、それとも上記のコードの間違いですか。ユーティリティ プログラムでそのリダイレクトを使用します。提案をありがとう。

4

3 に答える 3

0

fprintf() をコメントアウトして、最初と 2 番目の printf() が同じように動作するかどうかを確認します。私の推測では、 fprintf() がライブラリのデータ構造で予期しないことをしていると思います。

于 2013-06-23T20:00:51.070 に答える
0

fflush(stdout)ポップする前に試してみてください

于 2013-06-23T20:20:20.267 に答える