2

文字列があるとしますchar* str。次の方法でバッファに出力します。

char buf[MAX_LEN];
freopen("tmp","w",stdout);
printf("%s\n",str);
fflush(stdout);
fp = fopen(tmp,"r");
if (fp == NULL) return;
fgets(buf,MAX_LEN,fp);
fclose(fp);
fclose(stdout);

このコードにより、無効なストリームバッファハンドルが発生する可能性がありますか?freopen使用とその後の使用は合法fopenですか?私のシステムの制約に基づいて、私は使用できませfprintfsprintf

4

1 に答える 1

4

理論的には、それは完全に合法であり、正常に機能します。マニュアルページによると、これは主なユースケースですらあります。

このfreopen()関数は、名前がパスが指す文字列であるファイルを開き、ストリームが指すストリームをそのファイルに関連付けます。元のストリーム(存在する場合)は閉じられます。mode引数は、関数と同じように使用され fopen() ます。この関数の主な用途は 、標準のテキストストリーム( 、、、または)に関連付けられているファイルを変更することです。freopen()stderrstdinstdout

実際には、コードは機能しません。主にヘッダーとヘッダーの欠落の間"tmp"にいくつかの間違いがあります。tmpこのコードは機能します:

#include <stdio.h>
#define MAX_LEN 512

int main() {
  const char* str = "data\n";
  FILE* fp;
  char buf[MAX_LEN];

  freopen("tmp","w",stdout);
  printf("%s\n",str);
  fflush(stdout);
  fp = fopen("tmp","r");
  if (fp == NULL) return;
  fgets(buf,MAX_LEN,fp);
  // here, buf gets str's content 
  fclose(fp);
  fclose(stdout);
  return 0;
}
于 2012-04-08T21:19:34.483 に答える