powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование ifstream в качестве потока ввода
4 сообщений из 4, страница 1 из 1
Использование ifstream в качестве потока ввода
    #38294411
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Проблема с использованием 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
Использование ifstream в качестве потока ввода
    #38294416
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositumкак будто в блоке for попадаю в бесконечный цикл.
очепятка. Правильно так: как будто перед блоком for попадаю в бесконечный цикл.
...
Рейтинг: 0 / 0
Использование ifstream в качестве потока ввода
    #38294487
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Использование ifstream в качестве потока ввода
    #38294492
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v6y,

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


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