[C ] Импорт текстового файла — проблемы с getline()

#c #file #text #import

#c #файл #текст #импорт

Вопрос:

У меня возникли проблемы с чтением текстовых файлов на 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

Комментарии:

1. Почему не использовать fx.getline() ?

2. как linha=fx.getline();? Выдает ошибку..

3. fx >> linha; пока мы этим занимаемся.

4. Вы обработаете слишком много строк, так как eof не будет установлен, пока вы не прочитаете конец файла. Использование while( getline( fx, linha ) ) { }

Ответ №1:

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

 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.
  

Ответ №2:

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

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

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

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

Комментарии:

1. Я не хочу использовать getline, связанную с char, потому что я точно не знаю длину строки. У меня есть текстовый файл со следующим: Lisboa, Porto,300 Faro, Porto,600 Porto,Faro, 600 Maia, Porto,50 Porto, Covilha,150 Идея состоит в том, чтобы разделить строку в трех строковых переменных, используя запятую в качестве разделителя. Пробовал то, что предлагал Ed S., а также немного советовал, но безуспешно, все то же самое..

2. Как мне проверить, нет ли ошибок при его вызове?

3. @NunoNeto Возвращает ссылку на поток, поэтому вы можете просто использовать ! возвращаемое значение.