假设我有一个字符串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
。
答案 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;
}