Перенаправление стандартных потоков ввода-вывода в C++

Автор: Дмитриев В.Л., Суханов С.П.

Журнал: Теория и практика современной науки @modern-j

Статья в выпуске: 12-1 (18), 2016 года.

Бесплатный доступ

В работе кратко рассматривается возможность перенаправления стандартных потоков ввода-вывода в языке программирования С++, связанных с клавиатурой и экраном, в зависимости от текущей ситуации. Для демонстрации такой возможности приводится код программы с необходимыми пояснениями.

Язык программирования с++, потоки ввода-вывода, перенаправление потоков

Короткий адрес: https://sciup.org/140267739

IDR: 140267739

Текст научной статьи Перенаправление стандартных потоков ввода-вывода в C++

Обсуждение вопросов ввода-вывода в C++ представляет собой определенную проблему. Дело в том, что, во-первых, практически любая программа использует ввод и вывод, но средства ввода-вывода в С++ традиционно разрабатывались лишь для работы с несколькими встроенными типами данных. Во-вторых, С++ (как и С) не имеет операций ввода и вывода, встроенных в сам язык.

Для организации ввода-вывода С++ использует набор классов, определенных в заголовочных файлах iostream и fstream , поставляющихся со стандартными библиотеками классов [1-4].

Программа на С++ воспринимает ввод и вывод как потоки байтов. Байты входного потока могут поступать с клавиатуры, от другой программы или от других устройств хранения (например, жесткого диска). Аналогично, байты выходного потока могут передаваться на экран, принтер, отправляться другой программе, или другое устройство хранения.

Для стандартных потоков установленную по умолчанию связь с клавиатурой или экраном можно разорвать, и перенаправить ввод-вывод данных, например, в файловый поток [1]. Перенаправление стандартных потоков можно выполнять также непосредственно в программе. Ниже приведен пример простой программы, на основе которой можно продемонстрировать только что сказанное.

#include "stdafx.h"

#include

#include using namespace std;

int main()

{ setlocale(LC_ALL,"rus");

string s;

getline(cin,s);

cout<<"Строка: "<

freopen("CON", "w", stdout);

cout<<"\nWork is complete.\n";

system("pause"); return 0;}

Строка: The color

Символов: 9

Work is complete.

Для продолжения нажмите любую клавишу . . .

Теперь откроем командную строку, и введем в ней следующий текст:

Здесь мы используем перенаправление ввода (<) и перенаправление вывода (>), поэтому наша программа теперь будет находить длину строки, расположенной в файле text.txt , а результат помещать в файл out.txt . Часть команды < c:\text.txt ассоциирует стандартный ввод с файлом text.txt , поэтому объект cin читает ввод именно из этого файла, вместо клавиатуры. Часть команды > c:\out.txt ассоциирует стандартный вывод с файлом out.txt , поэтому объект cout направляет свой вывод именно в этот файл, а не на экран.

Строка: Пример вывода в файл Символов: 20

На экране при этом мы увидим сообщение:

Work is complete.

Для продолжения нажмите любую клавишу . . .

Отметим, что в программе строка freopen("CON", "w", stdout);

используется для переназначения вывода на экран. Формат использования функции freopen() следующий:

freopen (pathname, type, stream);

Данная функция закрывает текущий файл, связанный с потоком stream , и переназначает этот поток в файл, определяемый параметром pathname . В качестве результата функция возвращает указатель на вновь открытый файл (если в процессе возникает ошибка, прежний файл закрывается и функция возвращает значение NULL). Обычно эта функция используется для переадресации уже открытых потоков stdin , stdout , stderr, stdaux , stdprn в файлы, определяемые пользователем. При этом новый файл, связанный с потоком, открывается в режиме type :

  • -    " r " – открыть файл для чтения (файл должен существовать);

  • -    " w " – открыть пустой файл для записи (если файл существовал, его содержимое уничтожается);

  • -    " a " – открыть файл для добавления в конец (если файла не существовало, он создается);

  • -    " r+ " – открыть файл одновременно для чтения и записи (файл должен существовать);

  • -    " w+ " – открыть пустой файл для чтения и записи (если файл существовал, его содержимое уничтожается);

  • -    " a+ " – открыть файл для чтения и добавления (если файл

отсутствует, то он создается).

Поэтому то, что выводится объектом cout до вызова функции freopen() , записывается в файл out.txt , а то, что выводится после ее вызова – отображается на экране. Вообще, лучше использовать новый вариант этой функции – freopen_s() , старый вариант здесь оставлен только с целью совместимости с более старыми компиляторами.

Перенаправление вывода не применяется к стандартным потокам ошибок, представленным cerr и clog . Это означает, что если даже стандартный вывод cout будет перенаправлен, cerr и clog будут отображать сообщения на экране.

Список литературы Перенаправление стандартных потоков ввода-вывода в C++

  • Дмитриев В.Л. Теория и практика программирования на С. - Стерлитамак: РИО СФ БашГУ, 2013. - 308 с.
  • Прата С. Язык программирования С. Лекции и упражнения, 5-е изд.: Пер. с англ. - М.: Вильямс, 2007. - 1184 с.
  • Страуструп Б. Язык программирования С. Специальное издание. - М.: Бином, 2004. - 1054 с.
  • Stroustrup Bjarne. The C programming language / Bjarne Stroustrup. - Fourth edition. - Boston: Addison-Wesley, 2013. - 1368 p.
Статья научная