Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считывание данных из перенаправленного потока, Считывание данных из перенаправленного п 
:(
    Опции темы
Compositum
Дата 4.1.2013, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Доброго времени суток.

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

11
12
13
14
15
16
17

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

Код

// Перенаправление потоков ввода/вывода в C++
#include <iostream>
#include <fstream>

int main () {    
    // Сначала перенаправляем ввод...
    std::streambuf *inputBuckup = std::cin.rdbuf(); // запоминаем "родной" буфер потока ввода    
    std::ifstream inputFileStr("c:\\temp\\input.txt", std::ios::in);// файл для чтения в поток ввода
    if (!inputFileStr){
        std::cout << "Can't open the input file." << std::endl;
        return 1;
    }
    std::streambuf *inputFileBuf = inputFileStr.rdbuf(); // получаем буфер потока файла ввода    
    std::cin.rdbuf(inputFileBuf); // перенаправляем поток ввода на файл ввода

    // Теперь перенаправляем вывод...
    std::streambuf *outputBackup = std::cout.rdbuf();  // запоминаем "родной" буфер потока вывода
    std::ofstream outputFileStr("c:\\temp\\output.txt", std::ios::out);// файл для записи из потока вывода
    if (!outputFileStr){
        std::cout << "Can't open the output file." << std::endl;
        return 2;
    }
    std::streambuf *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 я получаю не то, что ожидал. Получаю такое:

Цитата

row 1: 0


В чём ошибка?

Это сообщение отредактировал(а) Compositum - 4.1.2013, 17:59
PM   Вверх
NoviceF
Дата 4.1.2013, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Как-то всё очень замудрено.. сейчас найду попроще код на тему.

В общем код на тему, на сколько соответствует заданию не буду вникать, но мне кажется должен дать пищу для размышлений:

Код

#include <fstream>
#include <iostream>

template<typename In, typename Out>
void Process(In& in, Out& out)
{
   //do some work, for example
   out << in.rdbuf();
}

using namespace std;

int main(int argc, char* argv[])
{
   fstream in, out;
   if (argc > 1) in.open (argv[1], ios::in  | ios::binary);
   if (argc > 2) out.open(argv[2], ios::out | ios::binary);
   
   Process (in.is_open()  ? in  : cin,
            out.is_open() ? out : cout);
}


Это сообщение отредактировал(а) NoviceF - 4.1.2013, 17:07
PM MAIL   Вверх
Compositum
Дата 4.1.2013, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата

Как-то всё очень замудрено.. 

На мой взгляд там всё понятно. За основу я взял код отсюда.
Цитата

В общем код на тему, на сколько соответствует заданию не буду вникать

Он не помогает понять причину проблемы.
PM   Вверх
Compositum
Дата 4.1.2013, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Если я содержимое файла input.txt заменю на такое:
Цитата(input.txt)

Иванов И.И. 4-43-21
Петров П.П. 4-65-11
Сидоров С.С. 4-21-21
Васильев В.В. 4-47-53


и в цикле внесу такие изменения:
Код

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.txt)

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


Хотелось бы понять, почему с числами не работает...
PM   Вверх
NoviceF
Дата 4.1.2013, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



К сожалению, сейчас нет IDE под рукой, а при помощи stringstream на http://liveworkspace.org организовать правдоподобно вывод в файл не получается, в поток то данные сохраняются и цифрами и стрингами, а вот в файл, на основе которого создаётся stringstream ничего не сохраняется.. Так что если и смогу проверить что-нибудь в "полевых условиях" - не раньше часов 2х ночи :(
PM MAIL   Вверх
NoviceF
Дата 4.1.2013, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Внезапно, но, вот вход
Код

10
20
30
40


вот выход:
Код

row 1: 10row 2: 20row 3: 30row 4: 40row 5: 0

так что с кодом всё в порядке..
PM MAIL   Вверх
volatile
Дата 5.1.2013, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

Цитата(Compositum @  4.1.2013,  16:46 Найти цитируемый пост)
Однако в файле output.txt я получаю не то, что ожидал. Получаю такое:
row 1: 0
В чём ошибка?


Ошибка в том, что поток надо проверять не до ввода, а после ввода. (очень частая ошибка.)
В вашем случае std::cin >> x; не смог прочитать из файла, и x осталась без изменений.
на следующей итерации, цикл завершился, так как while(std::cin) дал false.

В вот почему не смог прочитать из файла, может быть сотни причин. смотрите у себя...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0712 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.