Windows std :: ifstream :: open()问题

时间:2009-07-04 08:57:52

标签: c++ path debugging ifstream

我知道有一些关于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]中获取的整个绝对路径。

我哪里出错了,我需要做些什么来解决它?

3 个答案:

答案 0 :(得分:2)

我已经监督了这样一个事实的重要性:有问题的函数在没有检查是否为is_open()的情况下关闭了流()。

它将设置流的fail_bit(导致它评估为false)这一事实对我来说是全新的(这不是它的借口),我仍然不明白为什么这段代码以前工作。

无论如何,c ++引用很清楚;问题现在解决了。

答案 1 :(得分:1)

  1. 请创建一个重新创建问题的最小集。例如,在上面的代码中,解析了argv和字符串连接,这似乎不是问题的必要部分。一个最小的设置可以帮助你(和我们)确切地看到出了什么问题,而不是被“什么是GetPath()?”等问题分心。
  2. 尝试执行此操作而不是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问题:

  • 仅使用命令行构建
  • 确保您重建静态库