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()函数打开名称为 path 指向的字符串的文件,并将 stream 指向的流与它相关联。原始流(如果存在)已关闭。模式参数的使用与 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 回答