【问题标题】:fstream >> int failing?fstream >> int 失败?
【发布时间】:2011-01-11 12:23:05
【问题描述】:

知道为什么以下操作会失败吗?

std::fstream i(L"C:/testlog.txt", std::ios::binary | std::ios::in);
整数测试 = 0;
我 >> 测试;

fail() 正在返回 true。文件存在并已打开。

我检查了 i._Filebuffer._Myfile._ptr 它是指向文件缓冲区的指针,所以我不明白它为什么会失败。

【问题讨论】:

  • 请显示文件内容。
  • 我在 Windows 上编程不多,但你的文件名中没有斜杠错误吗? “C:\\testlog.txt”会更好吗?
  • @Dan:没关系; Windows 将在大多数情况下接受正斜杠或反斜杠(我不记得有例外,但这不是其中之一)。
  • 为什么要使用宽字符串? fstream 只需要一个 char* 流,所以那里正在发生一些有趣的事情,它可能正在尝试打开文件“C”

标签: c++ windows visual-studio-2008


【解决方案1】:

您正在以二进制模式打开文件。提取运算符旨在与文本文件一起使用。只需省略 std::ios::binary 标志即可以文本模式打开文件。

如果您确实有二进制文件,请改用read() 函数。

编辑:我也测试过,确实可以。我是从CPlusPlus.com 那里得到的,上面写着:

在二进制文件中,使用提取和插入运算符(>)和getline之类的函数来输入和输出数据效率不高,因为我们不需要格式化任何数据,并且数据可能不使用分隔符文本文件用来分隔元素的代码(如空格、换行符等)。

连同ios::binary 的描述,它只是说“将流视为二进制而不是文本。”,我现在完全糊涂了。这个答案正在变成一个自己的问题......

【讨论】:

  • 以二进制模式打开文件应该没有效果 - 所做的只是控制'\n'等字符的扩展 - 我刚刚测试过这个,顺便说一句。
  • @Thomas 它说它们“效率不高”(无论这意味着什么),而不是它们不起作用。
  • @Thomas:二元运算符与流运算符关系不大。它基本上表明从文件中读取时不需要进行文本转换。现在通过文本转换,我的意思是行序列的结束。 “\n”在输出时被翻译成行序列的结尾,而在输入时,行序列的结尾被翻译成“\n”。这就是 ALL 二进制和文本模式的区别。它没有其他影响。 (虽然这可能会花费少量的处理,但这并不会显着降低流操作符的效率)。
  • 然后,如果突然出现 \r 字符,在二进制文件上使用 > 可能会混淆 stdlib。此外,我发现“数据可能不使用文本文件使用的分隔代码来分隔元素”这句话非常令人困惑。我不知道...
  • 最好不要相信 cplusplus.com ,顺便说一句。它根据实现而不是标准来教授 C++,并且使用了不精确的术语。查看标准草案(或普遍接受的网站,如 C++ FAQ)会更好。
【解决方案2】:

以下内容:

#include <fstream>
#include <iostream>
using namespace std
int main() {
    std::fstream i("int.dat" , std::ios::binary | std::ios::in);
    int test = 0;
    if ( i >> test  ) {
        cout << "ok" << endl;
    }
}

当给定一个包含字符“123”的文件时打印“ok”。请发布一个类似的简短测试来说明您的代码失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多