2016-12-03 36 views
0

这个简单的程序,无法使用ifstream读取数据。读取总是一个空字符串。STD Filestream损坏? (内部文件缓冲区空,无法读取输入)

#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()是真的

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

ifstream in debug

我已经编制了Win32和x64和我得到相同的结果。

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

我不知道该怎么做。我从来没有见过这样的问题。我开始怀疑其他std对象是否也像这样被破坏了。或者,也许这是C文件流在某种形状中被损坏。

编辑***我已经删除了参数,但是无论读取什么数据都不是来自我的文件的内容。

enter image description here

+0

为什么你将随机参数传递给'ifstream'构造函数?你从哪里得到这些东西? [手册](http://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream)告诉你关于它们的是什么? –

+0

你指的是哪个随机参数?我正在传递路径和标志以供使用。 – Igneous01

+0

@ Igneous01'std :: ios :: failbit | std :: ios :: badbit'参数。 – 2016-12-03 03:24:56

回答

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

你创建一个已经标记为处于故障状态,它的构造后,立即一个文件对象。

现在,如果这不是你想要的,请删除failbitbadbit。实际上,完全摆脱了整个参数,因为第二个参数到ifstream的构造函数默认为ios::in

+0

我已经更新了我原来的帖子 - 仍然没有快乐。我忘了提及我先尝试不用标志,然后追加它们(我在SO上看到一篇文章提到将这些添加到构造函数中,因为它们会抛出异常)。 – Igneous01

0

我无法编译您的示例程序。并且参考saysexception不能用char*参数构建。改为使用,例如,runtime_error

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

+0

有趣的 - 异常当然可以把const char *作为消息的参数。你使用什么编译器? – Igneous01

+0

链接页面不同意'const char *'。我的编译器是gcc 5.3.1和clang 3.8.0。 – olpa

+0

我现在看到,vC++有允许const char *作为std :: exception参数的扩展。 https://msdn.microsoft.com/en-us/library/c4ts6d5a.aspx – Igneous01