Чтение строк из файла - удаление лишних пробелов

0

Я использую ifstream для получения строк из файла и сохранения их в строке. Каждая строка содержит одно слово без пробелов.

    virtual void readFromFile(char* input){
        ifstream inf(input);

        if(!inf){
            cerr << "The specified file could not be found." << endl;
        }

        while(inf){
            string str;
            getline(inf, str);
            pushFront(str); // store it in my data structure

        }

        inf.close();
    }

file.txt

a <= returns length 1 (correct)
at <= returns length 3
ate <= returns length 4
rate <= returns length 5
irate <= returns length 6

Когда я вызываю length() в строке, соответствующей самому первому из файла, он возвращает правильное значение. Однако length вызова в строках, соответствующих всем другим строкам, приводит к смещению +1. Например, если длина строки равна 5, она возвращает 6. Имеет ли это что-то общее с новыми строками? Если да, то как я могу правильно извлечь эти слова из файла?

  • 0
    Вы уверены, что в строках нет интервалов? Потенциально это может быть связано с двумя символами, которые системы Linux используют для новых строк '\ r' и '\ n', но я думаю, что getline обрежет их оба. Тем не менее, пожалуйста, попробуйте проверить, не заканчиваются ли неправильные слова на «\ r» или «\ n», и мы бы точно знали.
  • 0
    Позвольте мне проверить это.
Показать ещё 5 комментариев
Теги:
ifstream

2 ответа

1
Лучший ответ

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

В linux обычно заканчивается строка "\ r\n", которые на самом деле являются двумя символами. Я не совсем уверен, будет ли getline опускать их обоих или нет. Однако, как предосторожность, вы можете добавить следующую логику:

getline(inf, str);
int len = str.size();
if (str[len - 1] == '\r') {
   str.pop_back(); // not C++11 you do it str = str.erase(str.end() - 1);
}
pushFront(str); // store it in my data structure
0

Если формат в текстовом файле определен, каждая строка содержит ровно одно слово, поэтому проще и увереннее читать эти слова.

void readFromFile(char* input){
    ifstream inf(input);
    if(!inf){
        cerr << "The specified file could not be found." << endl;
    }
    for( string word; inf >> word; )
        pushFront( word ); // store it in my data structure
}   // inf.close() is done automaticly leaving the scope

Ещё вопросы

Сообщество Overcoder
Наверх
Меню