2012-04-08 45 views
1

假设我有一个字符串char* str。 我把它打印到缓冲器下列方式:使用freopen和fopen之后合法吗?

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

回答

2

从理论上讲,这是完全合法的,工作正常。它甚至它的主要用途的情况下,根据其手册页:

调用freopen()函数打开,其名称是字符串 指向路径和相关联的流指向流与 它的文件。原始流(如果存在)已关闭。使用模式参数 就像在fopen()函数中一样。该主要用途 freopen函数的()函数更改与标准 文本流有关的文件(错误,标准输入,标准输出或)

在实践中,你的代码将无法正常工作:主要是在“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; 
} 
+2

此外,虽然@Yakov不太可能碰上这一点,有(或至少是)系统对写开放,它会自动“锁定”阅读。在这种情况下,您通常会从试图读取'fopen'的时候返回NULL。这是...烦人。我尽量避免这些系统。 :-) – torek 2012-04-08 21:37:11

+1

@Coren - 这是显而易见的头。没有必要重复我的代码 – Yakov 2012-04-09 04:31:30