Функция 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д