【问题标题】:fstream not reading all integersfstream 没有读取所有整数
【发布时间】:2018-04-03 11:51:49
【问题描述】:

我创建了一个双向链表类和驱动程序。我应该从文本文件中读取整数到列表中,但它没有读取最后一个数字 (37),我不知道为什么。我几乎可以肯定,initializeItem() 或 insertItem() 函数没有问题,所以我没有列出这些,但如果需要我可以列出。

这是文本文件:

9 10 3 84 19 63 1 45 100 37

这是我必须阅读的代码:

DoublyLinkedList list;
ItemType item;
int input;
std::fstream fs;

fs.open(argv[1], fstream::in);
if (fs.is_open())
{
    fs >> input;
    while (!fs.eof())
    {
        item.initialize(input);
        list.insertItem(item);
        fs >> input;
    }
}
else
{
    cout << "File could not be opened."
         << " Try again"
         << endl;
    return 0;
}

当我打印出列表(排序)时,我得到了这个:

1 3 9 10 19 45 63 84 100

【问题讨论】:

  • 我稍微更改了您的代码以删除初始化和 insertItem 以便我可以运行。它按预期工作。因此,可能是您的 initializeItem() 或 insertItem() 函数导致了您的问题。我也同意@templatetypedef,虽然 (fs >> input) 会更好。

标签: c++ data-structures fstream doubly-linked-list


【解决方案1】:

如果由于读取文件结尾而导致操作未能完成,则不会触发流上的 .eof() 函数。相反,它报告在任何操作过程中是否遇到流的结尾。即使最后一次操作成功,.eof() 也完全有可能返回 true。事实上,普遍的看法是,如果您正在执行流读取,测试 .eof() 几乎总是错误的。

这是从流中读取的更好方法:

while (fs >> input) {
    ... do something with fs ...
}

此代码将重复从流中提取值,直到操作未能成功完成(由.fail() 确定,而不是.eof())。如果您知道数字是用空格分隔的,那么这种通用模式可能是从流中读取数字的最佳方式。

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多