假设我有一个字符串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
是否合法?基于系统的限制,我无法使用fprintf
和sprintf
。
从理论上讲,这是完全合法的,而且效果很好。根据其手册页,它甚至是其主要用例:
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;
}