我正在使用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 :(得分: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
答案 1 :(得分: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