从文件中读取行 - 删除多余的空格

时间:2014-02-27 07:07:08

标签: c++ ifstream

我正在使用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.这是否与新行有关?如果是这样,我该如何从文件中正确提取这些单词?

2 个答案:

答案 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