使用freopen和fopen之后是否合法?

时间:2012-04-08 21:08:37

标签: c printf fopen freopen

假设我有一个字符串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

1 个答案:

答案 0 :(得分:2)

从理论上讲,它完全合法并且运作良好。根据其手册页,它甚至是它的主要用例:

  

freopen()函数打开名称为字符串的文件   路径指向并关联流指向的流   它。原始流(如果存在)已关闭。模式参数   与fopen()函数一样使用。 主要用途的   freopen()函数是来更改与标准相关的文件   文本流(stderr,stdin或stdout)

在实践中,你的代码不起作用:主要在“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;
}