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

Поиск:

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


Senior developer
**


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

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



Доброго времени суток.
Проблема с использованием ifstream в качестве потока ввода. Запись в файл с помощью ofstream проходит успешно, а вот с обратным чтением что-то не заладилось. Проблемная строка кода помечена маркером "TODO". Брэйкпоинтом дохожу до указанной строки и далее ничего не происходит, как будто в блоке while попадаю в бесконечный цикл. 
Код

/*
main.cpp
© Андрей Бушман, 10/06/2013
Глава 10, задание 1.
*/
//-------------------------------------------------------------------------------------------------
#include <exception>
#include <iostream>
#include <string>
#include <vector>
#include<fstream>
using namespace std;
// Тестовая структура
struct Point{
    int x, y;
    Point(int xx, int yy): x(xx), y(yy){}
    Point(): x(0), y(0) {}
};
ostream& operator << (ostream& os, const Point& p){
    os << p.x << ',' << p.y;
    return os;
}
istream& operator >> (istream& is, Point& p){
    char ch;
    int x,y;
    if((cin >> x >> ch >> y) && ch == ',') p = Point(x,y);
    return is;
}
//=================================================================================================
int main()
    try{
        vector<Point> vp;
        Point p;
        while(cin){
            // Получаю некоторый набор данных, введённых пользователем        
            cout << "x,y: ";
            cin >> p;
            if(cin) vp.push_back(p);
        }
        // Отображаю полученные данные
        for(int i = 0; i < vp.size(); ++i) cout << vp[i] << ' ';
        cin.clear();
        string s;
        // сохраняю данные в файл
        cout << endl << "Output file name: ";
        if(!(cin >> s)) throw runtime_error("Invalid output file name.");
        // создаю поток для записи файла
        {    ofstream os(s.c_str());
        if(!os) throw runtime_error("Can't open file: " + s);
        for(int i = 0; i < vp.size(); ++i) os << vp[i] << ' ';
        } // здесь поток закрывается
        cout << "Read back..." << endl;
        vp.clear();        
        ifstream is(s.c_str()); // создаю поток чтения файла
        if(!is) throw runtime_error("Can't open file: " + s);
        while(is >> p) vp.push_back(p);    // TODO: здесь какой-то затык...
        for(int i = 0; i < vp.size(); ++i) cout << vp[i] << ' ';// вывожу на консоль то, что прочёл
}
catch(exception& e){
    cerr << e.what() << endl;
    return 1;
}
catch(...){
    cerr << "Unknown exception." << endl;
    return 2;
}

Уже не один раз просмотрел код, не пойму в чём ошибка... Буду признателен за подсказку.

Спасибо.
PM   Вверх
Compositum
Дата 11.6.2013, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


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

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



Ошибка (опечатка) найдена. Должно быть так:
Код

istream& operator >> (istream& is, Point& p){
    char ch;
    int x,y;
    if((is >> x >> ch >> y) && ch == ',') p = Point(x,y); // в прошлый раз вместо is был cin.
    return is;
}

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

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

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

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

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


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

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


 




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


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

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