powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Считывание данных из перенаправленного потока
4 сообщений из 4, страница 1 из 1
Считывание данных из перенаправленного потока
    #38100200
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Изучаю C++, разбираюсь с потоками... Написал исходный текстовый файл со следующим содержимым:

input.txt11
12
13
14
15
16
17


Я хочу перенаправить стандартный поток ввода на этот файл input.txt , а поток вывода - в файл output.txt , после чего прочитать всё, что поступает во входной поток (т.е. считав все прописанные в input.txt числа).

Исходный код такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
// Перенаправление потоков ввода/вывода в C++
#include <iostream>
#include <fstream>

int main () {	

	// Сначала перенаправляем ввод...

	std::streambuf *inputBuckup; // "родной" буфер потока ввода
	inputBuckup = std::cin.rdbuf(); // запоминаем "родной" буфер потока ввода
	std::streambuf *inputFileBuf; // буфер потока файла ввода
	std::ifstream inputFileStr("c:\\temp\\input.txt", std::ios::in);// файл для чтения в поток ввода

	if (!inputFileStr){
		std::cout << "Can't open the input file." << std::endl;
		return 1;
	}

	inputFileBuf = inputFileStr.rdbuf(); // получаем буфер потока файла ввода
	std::cin.rdbuf(inputFileBuf); // перенаправляем поток ввода, считывая всё из из файла ввода

	// Теперь перенаправляем вывод...

	std::streambuf *outputBackup; // "родной" буфер потока вывода
	outputBackup = std::cout.rdbuf();  // запоминаем "родной" буфер потока вывода
	std::streambuf *outputFileBuf; // буфер потока файла вывода

	std::ofstream outputFileStr("c:\\temp\\output.txt", std::ios::out);// файл для записи из потока вывода

	if (!outputFileStr){
		std::cout << "Can't open the output file." << std::endl;
		return 2;
	}

	outputFileBuf = outputFileStr.rdbuf(); // получаем буфер потока файла вывода
	std::cout.rdbuf(outputFileBuf); // перенаправляем поток вывода, отправляя всё в файл вывода

	// Теперь читаем всё из потока ввода, внося дополнительные поправки и 
	// перенаправляем результат в поток вывода...

	int i = 1;	
	// Когда при вводе достигается конец файла, потоку, связанному с файлом, присваивается
	// значение false.
	while(std::cin){
		// Предполагается, что в файле input.txt записаны числовые значения...
		int x = 0;
		std::cin >> x;
		std::cout << "row " << i++ << ": " << x;
	}	

	// При закрытии файлов их буферы потоков будут уничтожены. 
	// Поэтому, прежде чем закрыть файл, возвращаем обратно "родные" буферы потоков:
	std::cin.rdbuf(inputBuckup);
	std::cout.rdbuf(outputBackup);

	// Закрываем файлы
	inputFileStr.close();
	outputFileStr.close();

	return 0;
}



Однако в файле output.txt я получаю не то, что ожидал. Получаю такое:

output.txtrow 1: 0


Я ожидал выполнение итерации по каждому числу, записанному в файле input.txt и в качестве значения должен был фигурировать никак не 0... В чём ошибка?

Спасибо.
...
Рейтинг: 0 / 0
Считывание данных из перенаправленного потока
    #38100220
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я содержимое файла input.txt заменю на такое:
input.txtИванов И.И. 4-43-21
Петров П.П. 4-65-11
Сидоров С.С. 4-21-21
Васильев В.В. 4-47-53

и в цикле внесу такие изменения:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
while(std::cin){
	std::string surname; // фамилия
	std::string initials; // инициалы
	std::string phone;// телефон
	std::cin >> surname >> initials >> phone;
	if (surname.length())
		std::cout << "row " << i++ << ": " << surname << " " << initials <<
		" " << phone << std::endl;
}


То всё работает как надо:
output.txtrow 1: Иванов И.И. 4-43-21
row 2: Петров П.П. 4-65-11
row 3: Сидоров С.С. 4-21-21
row 4: Васильев В.В. 4-47-53

Хотелось бы понять, почему с числами не работает...
...
Рейтинг: 0 / 0
Считывание данных из перенаправленного потока
    #38105597
Westtrd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Compositum,

while (std::cin >> value ...)...
...
Рейтинг: 0 / 0
Считывание данных из перенаправленного потока
    #38106495
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ хочу перенаправить стандартный поток ввода на этот файл input.txt, а поток вывода - в файл output.txt, после чего прочитать всё, что поступает во входной поток (т.е. считав все прописанные в input.txt числа).
...
Код: plaintext
1.
	std::ifstream inputFileStr("c:\\temp\\input.txt", std::ios::in);// файл для чтения в поток ввода




Как бы перенаправить -- это другое, это когда программа читает stdin а не открывает новый файл.
Ты уж реши, что тебе надо. Можно и так, но если так делать, то нет перенаправления.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Считывание данных из перенаправленного потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]