【问题标题】:Fstream's tellg / seekg returning higher value than expectedFstream 的 tellg / seekg 返回的值比预期的要高
【发布时间】:2010-04-14 23:00:44
【问题描述】:

为什么会失败,它应该是简单且有效的?

fisier.seekg(0, ios::end);
long lungime = fisier.tellg();

这会返回一个比文件更大的值导致错误

char *continut = new char[lungime];

知道可能是什么问题吗?

我还尝试一次计数到文件末尾的一个字符,这呈现了相同的结果,比预期的要多。但是在使用 getline() 一次读取一行时,它可以工作,没有多余的空格......

【问题讨论】:

    标签: c++


    【解决方案1】:

    您猜测,您可能是在 Windows 下以翻译模式打开文件。当您只是寻找文件末尾时,当前位置不会考虑行尾翻译。一行的结尾(在外部文件中)用一对“\r\n”标记——但是当你读入它时,它只转换为一个“\n”。当您使用getline 一次读取一行时,\ns 也会全部被丢弃,因此即使在没有从外部表示到内部表示的转换的系统(例如 Unix/Linux)上,您仍然可以期待那些给出不同的尺寸。

    再一次,你真的应该忘记new [] 的存在。如果要将整个文件读入字符串,请尝试以下操作:

    std::stringstream continut;
    continut << fisier.rdbuf();
    

    continut.str() 是一个 std::string,包含文件中的数据。

    【讨论】:

    • 不错!我一直想知道是否有一种简单的方法可以排出 std::stream。
    • @Jerry Coffin:Bill 将所有对他的 LoadFileAsString 函数的调用都替换为纯粹的尴尬......
    【解决方案2】:

    Jerry Coffin 关于行尾的说法是正确的。

    但是,您不必使用 stringstream 来正确读取整个文件。您只需在 std::ifstream 构造函数中使用 std::ios::binary 将其作为二进制文件打开。

    【讨论】:

      猜你喜欢
      • 2013-12-28
      • 2023-02-04
      • 2014-12-11
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2021-06-30
      • 2019-05-05
      • 2013-03-18
      相关资源
      最近更新 更多