我知道有一些关于std :: ifstream :: open()的问题,但答案并没有解决我的问题。其中大多数都是针对Win32的,我使用的是SDL,没有触及任何特定于操作系统的功能(......没有包含在SDL中)。
问题是:std :: ifstream :: open()似乎不再起作用,因为我已经从Dev-C ++切换到Code :: Blocks(我一直使用相同的MinGW-GCC返回 - 两者都结束了,从Windows XP到Vista。 (它也适用于OS X / xcode(GCC后端)。)
我的项目链接到一个静态库,其中#includes< string>,< iostream>,< fstream>和< cassert>,然后调用静态库中定义的功能,静态库又调用std :: ifstream :: open()(这次,直接)。在此之后,流的计算结果为false(使用隐式bool转换运算符和good()方法)。
代码:
#include "myStaticLibrary.hpp"
int main(int argc, char **argv)
{
std::string filename("D:/My projects/Test/test.cfg");
std::cout << "opening '" << filename << "'..." << std::endl;
bool success(false);
// call to functionality in the static library
{
std::ifstream infile(filename.c_str());
success = infile.good();
// ...
}
// success == false;
// ...
return 0;
}
stdcout.txt说:
打开'D:/ My projects / Test / test.cfg'...
当我打开stdcout.txt,并将带有文件名的路径复制粘贴到“开始”菜单/“运行”时,文件将按原样打开(我不完全确定这有多大的诊断价值;另外,地址转换为以下格式:file:/// D:/My%20projects/test/test.cfg)。
我也尝试用双反斜杠转义序列替换'/'(再次,斜线工作正常),但结果是一样的。
它是一个调试版本,但我使用的是从main()的argv [0]中获取的整个绝对路径。
我哪里出错了,我需要做些什么来解决它?
答案 0 :(得分:2)
我已经监督了这样一个事实的重要性:有问题的函数在没有检查是否为is_open()的情况下关闭了流()。
它将设置流的fail_bit(导致它评估为false)这一事实对我来说是全新的(这不是它的借口),我仍然不明白为什么这段代码以前工作。
无论如何,c ++引用很清楚;问题现在解决了。
答案 1 :(得分:1)
尝试执行此操作而不是assert(infile.good())
:
断言(infile中);
答案 2 :(得分:0)
以下代码:
#include <string>
#include <iostream>
#include <fstream>
#include <assert.h>
using namespace std;;
int main(int argc, char **argv)
{
std::string filename("D:/My projects/Test/test.cfg");
std::cout << "opening '" << filename << "'..." << std::endl;
std::ifstream infile(filename.c_str());
assert(infile.good()); // fails
return 0;
}
如果我创建了所需的目录结构,在使用MinGW g ++ 4.4.0的Windows系统上运行正常。 test.cfg文件确实存在吗?如果要打开输入流,如果文件不存在则会失败。
修改:要删除任何DevC ++到CB问题: