| imho.ws |
![]() |
|
|
|
# 1 |
|
::VIP::
Регистрация: 14.05.2003
Адрес: 127.0.0.1
Сообщения: 852
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Чтение содержимого файла в массив. С++
Сама задача следующая: посчитать кол-во строк в файле, передать их в дин. массив и отсортировать.
Нужно прочитать содержимое файла(содержит числа в строчку, одно число одна строка). Так я считаю кол-во строк. Код:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream in("input.txt");
if(!in) {
cout << "Cannot open file.\n";
return 1;
}
char ch[255];
int lines=0;
while(in){
in.getline(ch,255);
lines++;
if(in)
cout<<ch<<endl;}
in.close(); //close stream
ofstream out("output.txt");
if(!out){
cout <<"error";
return 1;
}
out << lines;
out.close();
return 0;
}
Пробовал записать так: Код:
#include<fstream>
#include<iostream>
using namespace std;
int main()
{
int input[1001];
fstream infile;
infile.open("input.txt",ios::in);
for (int i=0;i<1001;i++)
{
if(infile.eof())
return -1;
infile >>input;
cout<<input<<endl;
}
return 0;
}
Компайлер спотыкается на строке infile >>input; Пробовал компилировать в VS8 и Dev++.
__________________
reality.sys corrupt Kernel panic - not syncing: Fatal exception halt life(y,n)? Последний раз редактировалось Warchief; 14.04.2007 в 16:05. |
|
|
|
|
# 4 |
|
::VIP::
Регистрация: 14.05.2003
Адрес: 127.0.0.1
Сообщения: 852
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Drakosha,
Bishop, Ага забыл... А, что нужно изменить в первом куске кода, чтобы можно было записать в ch[255] сразу значение интегер, а не char? Если просто поменять char на int, то естественно код не компилируется.
__________________
reality.sys corrupt Kernel panic - not syncing: Fatal exception halt life(y,n)? |
|
|
|
|
# 6 |
|
Junior Member
Регистрация: 19.04.2002
Адрес: Дом
Пол: Male
Сообщения: 187
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Информация к размышлению (точнее вопросы):
А почему бы не делать все за раз? Складывать в массив и попутно считать? Складывать сразу в отсортированом виде? А если в строке не число, пусть все умрет? А если строк больше чем тысяча одна, на оставшиеся пофиг? А почему бы не использовать std::vector? Я так понял это учебная задача, так вот практика показывает что если учебные задачи решаются абы как, то потом и на практике все будет решаться также. Извините если кого обидел. Просто когда начинаешь работать с каким-то крупным проектом и видишь там куски отвратительного когда, становится как-то грустно... P.S. а да еще - при чтении потока через >> совсем не очевидно что считается целая строка.
__________________
Дураки не динозавры - они не вымрут... Последний раз редактировалось PSyton; 26.04.2007 в 08:07. |
|
|
|
|
# 7 | |
|
::VIP::
Регистрация: 14.05.2003
Адрес: 127.0.0.1
Сообщения: 852
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
PSyton,
Цитата:
). Никаких определённых рекомендаций как решать эти задания тоже нет.Объясни пожалуйста почему, и если не трудно, объясни как сделать лучше?
__________________
reality.sys corrupt Kernel panic - not syncing: Fatal exception halt life(y,n)? |
|
|
|
|
|
# 8 | |
|
Junior Member
Регистрация: 19.04.2002
Адрес: Дом
Пол: Male
Сообщения: 187
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
А как пример одной из множества реализаций можно написать так: Код:
#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. |
|
|
|