Функция freopen(stdout) - "неверный дескриптор" - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! У Меня проблема с функцией freopen с использованием stdout... Я хотел сделать программу, которая бы, сперва создавала некий файл, после чего эта же программа могла бы загрузить текст из другого текстового файла и вывести его на экран. Для этого Я решил использовать функцию freopen. Т.е. что Я делаю: Я объявляю переменную файлового типа с указателем(FILE*), и присваиваю Ей значение через freopen("путь_файла","тип_доступа",/*как Я понимаю...*/метод_записи_или_получения_данных). Вот, что у Меня вышло:
FILE* MyFile=NULL;
char FileWay[BUFSIZ];
setlocale(LC_ALL,"Russian");
puts("Введите путь к сохраняемому файлу");
gets(FileWay);
MyFile=freopen(FileWay,"w",stdout);
puts("This is test-file from My programm(Microsoft Visual Studio Ultimate 2012)!");
fclose(MyFile);
Программа успешно создала текстовый файл, содержимое которого было "This is test-file from My programm(Microsoft Visual Studio Ultimate 2012)!". Далее, Я дополнил код аналогичным кодом, только теперь "r",stdin(т.е. теперь не записываем в файл, а читаем из файла). И в итоге у Меня вышел следующий код:
FILE* MyFile2=NULL;
char FileWay2[BUFSIZ];
char FileText2[BUFSIZ];
puts("Введите путь загружаемого файла");
gets(FileWay2);
if (freopen(FileWay2,"r",stdin)==NULL)
{
puts("Неверно введён файловый путь!");
return false;
}
else
{
MyFile2=freopen(FileWay2,"r",stdin);
gets(FileText2);
fclose(MyFile2);
puts(FileText2);
system("pause");
}
Если Я использую один лишь из этих кодов - программа работает правильно. Но когда Я использую оба эти кода, программа выдаёт Мне ошибку "Неверный дескриптор."(в самой консоли)...
Пробовал разделить код "началом/концом", но, это не помогло... Отдельно, каждый из этих кодов - работает(в крайнем случае, результат был именно таким, каким Я его ожидал увидеть), а если вместе - то, выдаётся ошибка "Неверный дескриптор."... Подскажите пожалуйста, как решить данную проблему?
Возможно, это связано с тем, что программа использует stdout/stdin, и нужно, как то указывать, что теперь Мы не используем файл, и саму команду fropen("путь_файла","метод_доступа",strout)...
#include "stdafx.h" //#define _CTR_SECURE_NO_WARNINGS
#include <stdio.h>
#include <locale.h>
#include <Windows.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
{
  FILE* MyFile=NULL;
  char FileWay[BUFSIZ];
  setlocale(LC_ALL,"Russian");
  puts("Введите путь к сохраняемому файлу");
  gets(FileWay);
  MyFile=freopen(FileWay,"w",stdout);
  puts("This is test-file from My programm(Microsoft Visual Studio Ultimate 2012)!");
  fclose(MyFile);
}
 
system("cls");
    
{
  FILE* MyFile2=NULL;
  char FileWay2[BUFSIZ];
  char FileText2[BUFSIZ];
  puts("Введите путь загружаемого файла");
  gets(FileWay2);
  if (freopen(FileWay2,"r",stdin)==NULL)
  {
  puts("Неверно введён файловый путь!");
  return false;
  }
  else
  {
  MyFile2=freopen(FileWay2,"r",stdin);
  gets(FileText2);
  fclose(MyFile2);
  puts(FileText2);
  system("pause");
  } 
}
return 0;
}

Решение задачи: «Функция freopen(stdout) - "неверный дескриптор"»

textual
Листинг программы
#include "stdafx.h"//Сюда добавляем так же #define _CRT_SECURE_NO_WARNINGS
#include <conio.h>
#include <locale.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    printf("Enter file way \n");
    char S1[BUFSIZ];
    gets(S1);
    FILE* F1=freopen(S1,"w", stdout);
    puts("This is test-file from Microsoft Visual Studio 2012!");
    fclose(F1);
    freopen("CON","w",stdout);
 
    FILE* F2;
    char S2[BUFSIZ];
    char RESULT[BUFSIZ];
    printf("Enter loading file way \n");
    gets(S2);
    if ((F2=freopen(S2,"r",stdin))==NULL)
    {
        printf("Error loading file! \n");
        return false;
    }
    else
    {
        gets(RESULT);
        fclose(F2);
        freopen("CON","r",stdin);
        printf("Loading file succsess! \n");
        puts(RESULT);
        _getch();
    }
    return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы.
  2. Определяем точку входа в программу.
  3. Выводим приглашение для ввода пути к файлу.
  4. Создаем массив для хранения пути к файлу.
  5. Считываем путь к файлу из консоли в массив S1 с помощью функции gets.
  6. Открываем файл или устройство, указанное в массиве S1, для записи с помощью функции freopen, сохраняя указатель в переменной F1.
  7. Выводим сообщение в файл, открытый для записи.
  8. Закрываем файл или устройство, на которое указывает F1, с помощью функции fclose.
  9. Открываем консоль для записи с помощью функции freopen.
  10. Выводим приглашение для ввода пути к файлу.
  11. Создаем массив для хранения пути к файлу.
  12. Считываем путь к файлу из консоли в массив S2 с помощью функции gets.
  13. Открываем файл или устройство, указанное в массиве S2, для чтения с помощью функции freopen, сохраняя указатель в переменной F2.
  14. Проверяем, удалось ли открыть файл для чтения. Если нет, выводим сообщение об ошибке и возвращаем false.
  15. Если файл успешно открыт, считываем содержимое файла в массив RESULT с помощью функции gets.
  16. Закрываем файл или устройство, на которое указывает F2, с помощью функции fclose.
  17. Открываем консоль для чтения с помощью функции freopen.
  18. Выводим сообщение о успешном чтении файла.
  19. Выводим содержимое массива RESULT с помощью функции puts.
  20. Ожидаем нажатия клавиши с помощью функции _getch.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5
Похожие ответы