2012-04-08 10 views
1

文字列がchar* strであるとします。 私は次のようにバッファにそれを印刷:freopenを使用するのは合法ですか?

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

理論上、それは完全に合法であり、正常に動作します。それは、そのmanページによると、でもその主なユースケースです:

freopenは()関数は、名前がpathで指され、ストリームが それにstreamが指す関連付ける文字列 あるファイルを開きます。元のストリーム(存在する場合)は閉じられています。 mode引数 は、fopen()関数と同様に使用されます。 主な用途 freopenはの()関数は、実際には、標準の テキストストリーム(stderr、stdin、またはstdout)に関連付けられたファイルを変更する

で、あなたのコードは動作しません。主に "tmp"との間に何らかの間違いがあります。tmp &ヘッダーがありません。このコードはします:@Yakovはこのに遭遇することはほとんどありませんしながら、

#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

はまた、そこにある(あるいは少なくともだった)あなたが書き込み用にオープンされたファイルを持っている場合、それは自動的に読み取りのために「ロック」のシステム。その場合、一般的には 'fopen'の読み込みの試みから' NULL'を返します。これは...迷惑です。私はこれらのシステムを避けようとしています。 :-) – torek

+1

@Coren - ヘッダについては明らかです。私のコードを複製する必要はありませんでした – Yakov

関連する問題