Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование ifstream в качестве потока ввода / 4 сообщений из 4, страница 1 из 1
11.06.2013, 16:55
    #38294411
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ifstream в качестве потока ввода
Доброго времени суток.
Проблема с использованием ifstream в качестве потока ввода. Запись в файл с помощью ofstream проходит успешно, а вот с обратным чтением что-то не заладилось. Проблемная строка кода помечена маркером "TODO". Брэйкпоинтом дохожу до указанной строки и далее ничего не происходит, как будто в блоке for попадаю в бесконечный цикл.
Код: 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.
62.
63.
64.
65.
66.
/*
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;
}


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

Спасибо.
...
Рейтинг: 0 / 0
11.06.2013, 16:57
    #38294416
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ifstream в качестве потока ввода
Compositumкак будто в блоке for попадаю в бесконечный цикл.
очепятка. Правильно так: как будто перед блоком for попадаю в бесконечный цикл.
...
Рейтинг: 0 / 0
11.06.2013, 17:40
    #38294487
v6y
v6y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ifstream в качестве потока ввода
Compositum,
Код: plaintext
1.
2.
3.
4.
5.
6.
istream& operator >> (istream& is, Point& p){
	char ch;
	int x,y;
	if((cin >> x >> ch >> y) && ch == ',') p = Point(x,y);
	return is;
}



Я так полагаю имелось ввиду:
Код: plaintext
1.
 if((is >> x >> ch >> y) && ch == ',') p = Point(x,y);



У вас в условии ожидание когда данные из потока is кончаться. А как они должны кончиться если вы их всегда со стандартного ввода читаете.
...
Рейтинг: 0 / 0
11.06.2013, 17:46
    #38294492
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование ifstream в качестве потока ввода
v6y,

Да, мне как раз только что указали на эту опечатку здесь . :) Глаз замылился... Спасибо!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование ifstream в качестве потока ввода / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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