STD 文件流损坏? (内部文件缓冲区为空,无法读取输入)

STD Filestream corrupted? (Internal File Buffer Null, unable to read input)

这个简单的程序,无法使用ifstream读取数据。读取始终为空字符串。

#include <fstream>
#include <string>
#include <iostream>

std::string getFileString(const std::string& path)
{
    std::ifstream file(path);
    if (!file) 
       throw std::exception("Cannot Open File");
    if (!file.is_open() && !file.good())
       throw std::exception("Cannot Open File");
    std::string t;
    file >> t;
    std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

    return content;
}

int main()
{
    std::string t = getFileString("C:\Users\user\Documents\folder\t1.txt");
    return 0;
}

我调试了几个小时,没办法解决。我在新项目中尝试过做同样的事情,但 ifstream 没有读取任何内容。

我确认:

我试过:

没有抛出异常(即使设置了 ios::failbit 和 ios::badbit)

文件很好

file.is_open() 为真且 file.good() 为真

当我在调试器中检查文件流对象时(构造函数调用后)它似乎已损坏(整个缓冲区为空,指针中有一堆空值,唯一有效的数据是对文件本身的引用) .

我针对 win32 和 x64 进行了编译,得到了相同的结果。

我修复了 VS 2012 的 C++ 可分发安装,这是同样的问题。

此时我不知道该怎么办。我以前从未见过这样的问题。我开始怀疑其他 std 对象是否也像这个一样损坏。或者可能是 C 文件流以某种形式损坏了。

编辑*** 我已经删除了参数,但是正在读取的任何数据都不是我文件中的数据。

std::ifstream file(path, std::ios::in | std::ios::failbit | std::ios::badbit);

您创建的文件对象在构建后立即被标记为处于失败状态。

现在,如果这不是您想要的,请去掉 failbitbadbit。事实上,完全摆脱整个参数,因为 ifstream 的构造函数的第二个参数无论如何默认为 ios::in

我无法编译你的示例程序。并且不能用 char* 参数构造 exception 的 cppreference says。改用,例如 runtime_error.

我的建议是你测试一些错误的程序。也许您的 IDE 无法编译源代码,但不知何故错过了它并调试了一些旧版本的二进制代码。

我也遇到了同样的bug,fstream构建后全为Null是正常的,lol我在很多新项目中检查了很多次。这就是为什么 good() 和 is_open() 都是真的。问题是文件中的数据是如何读取的,文件内容不是您正在读取的格式我认为,使用流迭代器,它会导致读取您在使用流构造时传递给它的类型,嗯在我的例子中,它导致读取超过了流的末尾,因为我认为保存到文件中的数据格式实际上并非如此。在你的文件中,我认为该文件是一个二进制文件,请尝试使用 unsigned char 而不仅仅是 char。希望这能解决问题