Цитата:
Сообщение от 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);