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 没有读取任何内容。
我确认:
文件中有数据
路径正确
我正在调试下编译,使用调试库
我试过:
std::getline(文件, t)
file.getline
使用迭代器
使用 >> 运算符
没有抛出异常(即使设置了 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);
您创建的文件对象在构建后立即被标记为处于失败状态。
现在,如果这不是您想要的,请去掉 failbit
和 badbit
。事实上,完全摆脱整个参数,因为 ifstream
的构造函数的第二个参数无论如何默认为 ios::in
。
我无法编译你的示例程序。并且不能用 char*
参数构造 exception
的 cppreference says。改用,例如 runtime_error
.
我的建议是你测试一些错误的程序。也许您的 IDE 无法编译源代码,但不知何故错过了它并调试了一些旧版本的二进制代码。
我也遇到了同样的bug,fstream构建后全为Null是正常的,lol我在很多新项目中检查了很多次。这就是为什么 good() 和 is_open() 都是真的。问题是文件中的数据是如何读取的,文件内容不是您正在读取的格式我认为,使用流迭代器,它会导致读取您在使用流构造时传递给它的类型,嗯在我的例子中,它导致读取超过了流的末尾,因为我认为保存到文件中的数据格式实际上并非如此。在你的文件中,我认为该文件是一个二进制文件,请尝试使用 unsigned char 而不仅仅是 char。希望这能解决问题
这个简单的程序,无法使用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 没有读取任何内容。
我确认:
文件中有数据
路径正确
我正在调试下编译,使用调试库
我试过:
std::getline(文件, t)
file.getline
使用迭代器
使用 >> 运算符
没有抛出异常(即使设置了 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);
您创建的文件对象在构建后立即被标记为处于失败状态。
现在,如果这不是您想要的,请去掉 failbit
和 badbit
。事实上,完全摆脱整个参数,因为 ifstream
的构造函数的第二个参数无论如何默认为 ios::in
。
我无法编译你的示例程序。并且不能用 char*
参数构造 exception
的 cppreference says。改用,例如 runtime_error
.
我的建议是你测试一些错误的程序。也许您的 IDE 无法编译源代码,但不知何故错过了它并调试了一些旧版本的二进制代码。
我也遇到了同样的bug,fstream构建后全为Null是正常的,lol我在很多新项目中检查了很多次。这就是为什么 good() 和 is_open() 都是真的。问题是文件中的数据是如何读取的,文件内容不是您正在读取的格式我认为,使用流迭代器,它会导致读取您在使用流构造时传递给它的类型,嗯在我的例子中,它导致读取超过了流的末尾,因为我认为保存到文件中的数据格式实际上并非如此。在你的文件中,我认为该文件是一个二进制文件,请尝试使用 unsigned char 而不仅仅是 char。希望这能解决问题