我知道有一些关于std::ifstream::open()的问题,但是答案并没有解决我的问题。其中大部分都是特定于Win32的,我使用的是SDL,没有涉及任何特定于操作系统的功能(...这没有被打包到SDL中)。
问题是:自从我从Dev-C++切换到Code::Blocks(我一直在使用相同的MinGW-GCC后端),以及从Windows XP切换到Vista后,std::ifstream::open()似乎不再工作了。(它在OS X / xcode(GCC后端)中也能完美工作。)
我的项目链接到一个静态库,其中#包括、和,然后调用静态库中定义的函数,该函数依次调用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:/我的项目/测试/test. cfg”...
当我打开stdcout.txt,并将路径和文件名复制粘贴到“开始”菜单/“运行”时,该文件按预期打开(虽然我不完全确定这有多大的诊断价值;此外,地址被转换为以下格式:文件:///D:/我的% 20项目/测试/测试. cfg)。
我也尝试过用双反斜杠转义序列替换'/' s(同样,斜杠以前也很好用),但结果是一样的。
它 * 是 * 一个调试版本,但我使用的是从main()的argv[0]中获取的完整的绝对路径。
我哪里出了问题,我需要做什么来修复它?
3条答案
按热度按时间nqwrtyyt1#
1.请创建一个最小集合来重现问题。例如,在上面的代码中,有对argv和字符串连接的解析,这似乎不是问题的必要部分。一个最小集合将帮助您(和我们)确切地看到哪里出了问题,而不是被诸如“GetPath()是什么?"之类的问题分心。
1.尝试执行此操作,而不是
assert(infile.good())
:assert(文件中);
vc6uscn92#
我已经注意到了这样一个事实的重要性,即所讨论的函数在没有检查它是否为
is_open()
的情况下就将close()
d流。事实上,它将设置流的fail_bit(导致它求值为false)对我来说是全新的(这并不是一个借口),我仍然不明白为什么这段代码以前能工作。
不管怎么说,C++参考对它是相当清楚的;现在问题解决了。
tv6aics13#
下面的代码:
如果我创建了所需的目录结构,那么在我使用MinGW g++ 4.4.0的Windows系统上运行的很好。文件test.cfg真的存在吗?如果你正在打开一个输入流,如果文件不存在,它将失败。
**编辑:**要删除任何DevC++到CB得问题: