IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Чтение содержимого файла в массив. С++ (http://www.imho.ws/showthread.php?t=117978)

Warchief 14.04.2007 16:02

Чтение содержимого файла в массив. С++
 
Сама задача следующая: посчитать кол-во строк в файле, передать их в дин. массив и отсортировать.
Нужно прочитать содержимое файла(содержит числа в строчку, одно число одна строка). Так я считаю кол-во строк.
Код:

#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;
}

Потом мне надо прочитать тот-же файл ещё раз и загрузить числа в массив(одна строка, одна ячейка в массиве.)Нужно для последующей сортировки(как сортировать я знаю.)Проблема в том, что я не знаю как записать тип int в массив.


Пробовал записать так:
Код:

#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++.
:молись: :молись:

Drakosha 15.04.2007 11:28

скорее всего ты забыл индекс:
infile >>input[i];

Bishop 15.04.2007 11:48

Warchief,
infile >> input[i];

[upd] Долго писал :) Drakosha опередил.

Warchief 15.04.2007 18:48

Drakosha,
Bishop,

Ага забыл...


А, что нужно изменить в первом куске кода, чтобы можно было записать в ch[255] сразу значение интегер, а не char? Если просто поменять char на int, то естественно код не компилируется.:idontnow:

Drakosha 15.04.2007 18:58

по моему можно написать:

int xx;
in >> xx;

PSyton 26.04.2007 08:05

Информация к размышлению (точнее вопросы):
А почему бы не делать все за раз?
Складывать в массив и попутно считать?
Складывать сразу в отсортированом виде?
А если в строке не число, пусть все умрет?
А если строк больше чем тысяча одна, на оставшиеся пофиг?
А почему бы не использовать std::vector?

Я так понял это учебная задача, так вот практика показывает что если учебные задачи решаются абы как, то потом и на практике все будет решаться также. Извините если кого обидел. Просто когда начинаешь работать с каким-то крупным проектом и видишь там куски отвратительного когда, становится как-то грустно...

P.S. а да еще - при чтении потока через >> совсем не очевидно что считается целая строка.

Warchief 06.05.2007 20:36

PSyton,


Цитата:

Сообщение от PSyton (Сообщение 1398907)
Информация к размышлению (точнее вопросы):
А почему бы не делать все за раз?
Складывать в массив и попутно считать?
Складывать сразу в отсортированом виде?
А если в строке не число, пусть все умрет?
А если строк больше чем тысяча одна, на оставшиеся пофиг?
А почему бы не использовать std::vector?

Я так понял это учебная задача, так вот практика показывает что если учебные задачи решаются абы как, то потом и на практике все будет решаться также. Извините если кого обидел. Просто когда начинаешь работать с каким-то крупным проектом и видишь там куски отвратительного когда, становится как-то грустно...

Ты прав, задача учебная. Дело в том, что до этого момента я нокогда не сталкивался с с++, времени дают очень мало, поэтому просто не успеваю разбираться с заданием как следует, к тому-же задания у нас дают в рамках совсем другого предмета(програмирования у нас вообще нет :( ). Никаких определённых рекомендаций как решать эти задания тоже нет.



Цитата:

Сообщение от PSyton (Сообщение 1398907)
P.S. а да еще - при чтении потока через >> совсем не очевидно что считается целая строка.

Объясни пожалуйста почему, и если не трудно, объясни как сделать лучше?

PSyton 06.05.2007 21:47

Цитата:

Сообщение от Warchief (Сообщение 1404015)
Объясни пожалуйста почему, и если не трудно, объясни как сделать лучше?

Оператор >> читает из потока до первого разделителя, коим может быть конец строки или пробел или табуляция, потому если в строке есть что-то типа "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);



Часовой пояс GMT +4, время: 02:34.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.