2012-04-08 2 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? Основываясь на ограничениях моей системы, я не могу использовать fprintf и sprintf.

ответ

2

Теоретически это совершенно законно и отлично работает. Это даже его основной случай использования, в соответствии с его странице:

Функция freopen() открывает файл, имя которого является строка указывает путь и связывает поток, на который указывает поток с его. Исходный поток (если он существует) закрыт. Аргумент режима используется так же, как и в функции fopen(). первичное использование из freopen() функция изменить файл, связанный со стандартным текстового потока (STDERR, STDIN, или стандартный вывод)

На практике, ваш код не будет работать: есть некоторая ошибка, главным образом, между «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 вряд ли работать в этом есть (или, по крайней мере, были) системы, где, если у вас есть файл открыт для записи, он автоматически «заблокирован» для чтения. В этом случае вы обычно получите 'NULL' обратно из попытки« fopen'-for-reading. Это ... раздражает. Я стараюсь избегать этих систем. :-) – torek

+1

@Coren - это очевидно о header.There не нужно дублировать мой код – Yakov