Законно ли использовать 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;
}
Другие вопросы по тегам