Показать сообщение отдельно
Старый 06.05.2007, 21:47     # 8
PSyton
Junior Member
 
Аватар для PSyton
 
Регистрация: 19.04.2002
Адрес: Дом
Пол: Male
Сообщения: 187

PSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форумеPSyton Популярный человек на этом форуме
Цитата:
Сообщение от Warchief Посмотреть сообщение
Объясни пожалуйста почему, и если не трудно, объясни как сделать лучше?
Оператор >> читает из потока до первого разделителя, коим может быть конец строки или пробел или табуляция, потому если в строке есть что-то типа "abc 2234", то << считает только "abc". Потому в подобных случаях целесообразнее испоользовать cin.getline(), если предполагать что размер строки заведомо меньше заданного в функции. В случае же когда непонятно какого размера строки могут встретиться из потока читается какое-то количество байт и потом там ищется символ конца строки. И этот процесс продолжается итеративно, с последующим добавлением следующих байтов из потока, пока он не закончится.
А как пример одной из множества реализаций можно написать так:

Код:
#include <iostream>
#include <set>
#include<fstream>
#include<iostream>
using namespace std;

int main()
{
	multiset<int> sorted_data; //Объявляем шаблонный класс упорядоченного множетсва.
	ifstream in("input.txt");
	if(!in)
	{
		cout << "Cannot open file." << endl;
		return -1;
	}
	else
		while (in) //Читаем файл
		{
			char line[255];
			in.getline(line, 255);
			sorted_data.insert(atoi(line));
		}
		in.close();
		cout << "Lines count: " << sorted_data.size() << endl; //Количество прочитанных строк.
		ofstream out("output.txt");
		if(!out) 
		{
			cout << "Can't open output file";
			return -1;
		}
		//Записываем в выходной файл числа в отсотртированном виде.
		multiset<int>::const_iterator i = sorted_data.begin();
		multiset<int>::const_iterator ei = sorted_data.end();
		for (; i != ei; ++i)
		{
			out << *i << endl;
		}
		out.close();
		return 0;
}
Судя по задаче доподлинно известно что во входящем файле только числа на каждой строке, потому
Код:
		char line[255];
		in.getline(line, 255);
		sorted_data.insert(atoi(line));
//можно, как заметил Drakosha, заменить на 
		int tmp;
		in >> tmp;
		sorted_data.insert(tmp);
__________________
Дураки не динозавры - они не вымрут...

Последний раз редактировалось PSyton; 06.05.2007 в 21:52.
PSyton вне форума