使用freopen及其后fopen是否合法?

问题描述 投票:1回答:1

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

c printf fopen freopen
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.