[C ++] Импорт текстового файла - проблемы с getline () - PullRequest
0 голосов
/ 24 октября 2011

У меня были проблемы с чтением текстовых файлов в c ++, особенно при назначении строки переменной.

У меня есть следующий код:

ifstream fx;
fx.open(nomeFich);
if(!fx)
{cout << "FX. nao existe!" <<endl;}
string linha="";;
int pos, inic;

while(!fx.eof())
{
    getline(fx,linha);

    if(linha.size() > 0)
    {
        cout << linha << endl;
        inic=0;
        pos=0;
        pos=linha.find(",",inic);
        cout << pos << endl;
        string nomeL1(linha.substr(inic,pos));
        cout << "atribuiu 1" << endl;
        inic=pos;

        cout <<"inic: " << inic << "      pos:" << pos <<endl;

        pos=linha.find(',',inic);
        string nomeL2(linha.substr(inic,pos));
        cout << "atribuiu 2" << endl;
        inic=pos;

        cout <<"inic: " << inic << "      pos:" << pos <<endl;

        pos=linha.find(',',inic);
        cout << "atribuiu 3" << endl;
        string dist(linha.substr(inic,pos));

Когда это делаетcout << linha << endl; возвращает что-то вроде:

= = == = = = = == = = = = = = == = = = = == = = = = =

Я довольно много гуглил и не могу найти ответ.Я новичок в C ++, так что не слишком много ломайте xD

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Не делай этого:

while(!fx.eof())
{
    getline(fx,linha);   // Here you have to check if getline() actually succeded
                         // before you do any further processing.
                         // You could add if (!fx) { break;}

    // STUFF;
}

Но лучший дизайн:

while(getline(fx,linha))  // If the read works then enter the loop otherwise don't
{
    // STUFF
}

Вы не можете пройти через запятую:

inic=pos;                  // pos is the position of the last ',' or std::string::npos
pos=linha.find(',',inic);  // So here pos will be the same as last time.
                           // As you start searching from a position that has a comma.
0 голосов
/ 24 октября 2011

ifstream имеет функцию getline, он принимает char* в качестве первого параметра и максимальную длину в качестве второго.

ifstream также имеет operator>>, который вы должны использовать для ввода, но он будет читать до пробела, а это не то, что вам нужно.

::getline, который вы используете, также должен работать, но это при условии, что с потоком все в порядке, что, как упоминалось ранее, вы не проверяете правильно. Вы должны проверять ошибки после вызова, потому что, если вы достигнете EOF или возникнет ошибка, вы не узнаете, пока не закончится весь цикл.

Кроме того, что находится в файле? Может быть, то, что вы получаете, является правильным результатом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...