Законно ли использовать freopen и после этого открывать?
Предположим, у меня есть строка 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
,
1 ответ
По идее, это совершенно законно и отлично работает. Это даже его основной вариант использования, согласно его man-странице:
Функция freopen() открывает файл, имя которого является строкой, на которую указывает путь, и связывает с ней поток, на который указывает поток. Исходный поток (если он существует) закрыт. Аргумент mode используется так же, как и в функции 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;
}