Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Считывание данных из перенаправленного потока / 4 сообщений из 4, страница 1 из 1
04.01.2013, 18:44
    #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
04.01.2013, 19:24
    #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
10.01.2013, 21:40
    #38105597
Westtrd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считывание данных из перенаправленного потока
Compositum,

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




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


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