Функция freopen(stdout) - "неверный дескриптор" - C (СИ)
Формулировка задачи:
Здравствуйте! У Меня проблема с функцией freopen с использованием stdout...
Я хотел сделать программу, которая бы, сперва создавала некий файл, после чего эта же программа могла бы загрузить текст из другого текстового файла и вывести его на экран.
Для этого Я решил использовать функцию freopen.
Т.е. что Я делаю:
Я объявляю переменную файлового типа с указателем(FILE*), и присваиваю Ей значение через freopen("путь_файла","тип_доступа",/*как Я понимаю...*/метод_записи_или_получения_данных).
Вот, что у Меня вышло:
Программа успешно создала текстовый файл, содержимое которого было "This is test-file from My programm(Microsoft Visual Studio Ultimate 2012)!".
Далее, Я дополнил код аналогичным кодом, только теперь "r",stdin(т.е. теперь не записываем в файл, а читаем из файла).
И в итоге у Меня вышел следующий код:
Если Я использую один лишь из этих кодов - программа работает правильно. Но когда Я использую оба эти кода, программа выдаёт Мне ошибку "Неверный дескриптор."(в самой консоли)...
Пробовал разделить код "началом/концом", но, это не помогло...
Отдельно, каждый из этих кодов - работает(в крайнем случае, результат был именно таким, каким Я его ожидал увидеть), а если вместе - то, выдаётся ошибка "Неверный дескриптор."...
Подскажите пожалуйста, как решить данную проблему?
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);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;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы.
- Определяем точку входа в программу.
- Выводим приглашение для ввода пути к файлу.
- Создаем массив для хранения пути к файлу.
- Считываем путь к файлу из консоли в массив S1 с помощью функции gets.
- Открываем файл или устройство, указанное в массиве S1, для записи с помощью функции freopen, сохраняя указатель в переменной F1.
- Выводим сообщение в файл, открытый для записи.
- Закрываем файл или устройство, на которое указывает F1, с помощью функции fclose.
- Открываем консоль для записи с помощью функции freopen.
- Выводим приглашение для ввода пути к файлу.
- Создаем массив для хранения пути к файлу.
- Считываем путь к файлу из консоли в массив S2 с помощью функции gets.
- Открываем файл или устройство, указанное в массиве S2, для чтения с помощью функции freopen, сохраняя указатель в переменной F2.
- Проверяем, удалось ли открыть файл для чтения. Если нет, выводим сообщение об ошибке и возвращаем false.
- Если файл успешно открыт, считываем содержимое файла в массив RESULT с помощью функции gets.
- Закрываем файл или устройство, на которое указывает F2, с помощью функции fclose.
- Открываем консоль для чтения с помощью функции freopen.
- Выводим сообщение о успешном чтении файла.
- Выводим содержимое массива RESULT с помощью функции puts.
- Ожидаем нажатия клавиши с помощью функции _getch.