Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STD文件流已损坏?(内部文件缓冲区为空,无法读取输入)_C++_C++11_Visual Studio 2012 - Fatal编程技术网

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

C++ STD文件流已损坏?(内部文件缓冲区为空,无法读取输入),c++,c++11,visual-studio-2012,C++,C++11,Visual Studio 2012,这个简单的程序,不能使用ifstream读取数据。读取总是一个空字符串 #include <fstream> #include <string> #include <iostream> std::string getFileString(const std::string& path) { std::ifstream file(path); if (!file) throw std::exception("Cannot

这个简单的程序,不能使用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;
}
#包括
#包括
#包括
std::string getFileString(const std::string和path)
{
std::ifstream文件(路径);
如果(!文件)
抛出std::异常(“无法打开文件”);
如果(!file.is_open()&&&!file.good())
抛出std::异常(“无法打开文件”);
std::字符串t;
文件>>t;
std::字符串内容((std::istreambuf_迭代器(文件)),std::istreambuf_迭代器();
返回内容;
}
int main()
{
std::string t=getFileString(“C:\\Users\\user\\Documents\\folder\\t1.txt”);
返回0;
}
我已经试着调试了几个小时,但没有办法修复它。我在新项目中尝试过做完全相同的事情,而ifstream没有读取任何内容

我确认:

  • 文件中有数据

  • 这条路是正确的

  • 我正在使用调试库进行调试

我试过:

  • std::getline(文件,t)

  • file.getline

  • 使用迭代器

  • 使用>>运算符

不会引发异常(即使设置了ios::failbit和ios::badbit)

档案很好

file.is_open()为true,file.good()为true

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

我已经为win32和x64进行了编译,得到了相同的结果

< >我修复了VS 2012的C++可配置安装,这是同一个问题。

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

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

您创建了一个文件对象,该对象在构建后立即被标记为处于失败状态

现在,如果这不是您想要的,请删除
failbit
badbit
。实际上,完全去掉整个参数,因为
ifstream
的构造函数的第二个参数默认为
ios::In

您创建了一个文件对象,该对象在构建后立即被标记为处于失败状态


现在,如果这不是您想要的,请删除
failbit
badbit
。事实上,完全去掉整个参数,因为
ifstream
的构造函数的第二个参数默认为
ios::In

我无法编译示例程序。以及不能用
char*
参数构造
exception
的引用。例如,使用
运行时错误


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

我无法编译您的示例程序。以及不能用
char*
参数构造
exception
的引用。例如,使用
运行时错误



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

为什么要将随机参数传递给
ifstream
构造函数?你从哪里弄来的?关于它们你知道什么?你指的是哪些随机参数?我正在传递路径和要使用的标志。@Igneous01
std::ios::failbit | std::ios::badbit
参数。我更新了帖子-很抱歉,我应该显示没有标志的原始代码。我在阅读之后添加了这些,以便控制是否从ifstream抛出异常。请使用
|
而不是
中的
&&
!file.is_open()&&!file.good()
。对于
&&
,两个条件都必须为true(即文件未打开且文件不好)才能引发异常。为什么要将随机参数传递给
ifstream
构造函数?你从哪里弄来的?关于它们你知道什么?你指的是哪些随机参数?我正在传递路径和要使用的标志。@Igneous01
std::ios::failbit | std::ios::badbit
参数。我更新了帖子-很抱歉,我应该显示没有标志的原始代码。我在阅读之后添加了这些,以便控制是否从ifstream抛出异常。请使用
|
而不是
中的
&&
!file.is_open()&&!file.good()
。使用
&&
,两个条件都必须为真(即文件未打开且文件不好)才能引发异常。我已更新了我的原始帖子-仍然没有乐趣。我忘了提到我先尝试了不带标志,然后又附加了标志(我在上看到一篇文章,上面提到了将这些标志添加到构造函数中,因为它们会引发异常)。我已经更新了我的原始文章-仍然没有乐趣。我忘了提到我先尝试不使用标志,然后在后面附加标志(我在上看到一篇文章,提到将这些标志添加到构造函数中,因为它们会引发异常)。有趣的是,异常当然可以将const char*作为消息的参数。您使用的编译器是什么?链接页面不同意
const char*
。我的编译器是gcc 5.3.1和clang 3.8.0。我现在看到,vc++有扩展,允许const char*作为std::exception的参数。下一个想法:文件
t1.txt
是否可能不包含空格(代码为32的符号)?如果是这样,那么所有的骗局
std::ifstream file(path, std::ios::in | std::ios::failbit | std::ios::badbit);