Я использую 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. Имеет ли это что-то общее с новыми строками? Если да, то как я могу правильно извлечь эти слова из файла?
Вы используете 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
Если формат в текстовом файле определен, каждая строка содержит ровно одно слово, поэтому проще и увереннее читать эти слова.
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