如何以列表格式读取文件时忽略换行符

时间:2011-08-05 22:25:01

标签: c++ newline ignore ifstream

我正在尝试读取包含标题和作者列表的文件,我需要能够忽略分隔文件中每一行的换行符。

例如,我的.txt文件可能有这样的列表:

自私基因

理查德道金斯

一个勇敢的新世界

Aldous Huxley

太阳也升起

欧内斯特·海明威

我必须使用并行数组来存储这些信息,然后才能像这样格式化数据:

自私基因(Richard Dawkins)

我试图用 getline 来读取数据,但是当我去格式化标题和作者时,我得到了这个:

自私基因

(理查德道金斯

当我从文件中读取列表时,如何忽略换行符?

这是我到目前为止所做的:

    int loadData(string pathname)
    {
    string bookTitle[100];
    string bookAuthor[100];
    ifstream inFile;
    int count = -1; //count number of books
    int i; //for variable

    inFile.open(pathname.c_str());
    {
        for (i = 0; i < 100; i++) 
        {
            if(inFile)
            {
                getline(inFile, bookTitle[i]);
                getline(inFile, bookAuthor[i]);
                count++;
            }
        }
        inFile.close();
        return count;
    }

我非常感谢任何帮助!

理查德

编辑:

这是我的输出功能:

    void showall(int count)
    {
        int j; //access array up until the amount of books
        for(j = 0; j < count; j++)
        {
             cout << bookTitle[j] << " (" << bookAuthor[j] << ")";
             cout << endl;
        }    
    } 

我在这里做错了吗?

2 个答案:

答案 0 :(得分:2)

正如@Potatoswatter所说,std::getline通常会删除换行符。如果换行仍在进行中,您可能正在使用一个系统,该系统使用\n作为换行符,但您的文件有\r\n个换行符。

在添加到字符串后删除额外的换行符。你可以用以下的东西来做到这一点:

s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::isspace)).base(), s.end());

或类似的。您会在std::find_if中找到<algorithm>,在std::isspace中找到<clocale>,在std::not1找到<functional>

答案 1 :(得分:0)

我知道了!问题是我正在阅读的文件。我使用.txt中的标题和作者复制并粘贴了文件,我的教师将我们放到了一个新的.txt文件中,现在它的工作方式很好!谢谢大家的帮助!!