0

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

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

4

3 回答 3

2

我已经监督了这样一个事实的重要性,即所讨论的函数已经关闭()流而不检查它是否是_open()。

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

无论如何,c ++参考很清楚;现在问题已经解决了。

于 2009-07-09T19:16:03.243 回答
1
  1. 请创建一个重现问题的最小集合。例如,在您上面的代码中,解析了 argv 和字符串连接,这似乎不是问题的必要部分。一个最小的集合将帮助您(和我们)确切地看到出了什么问题,并且不会被诸如“什么是 GetPath()?”之类的问题分心。
  2. 尝试这样做而不是assert(infile.good())

    断言(infile);

于 2009-07-04T09:04:46.333 回答
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 问题:

  • 仅使用命令行构建
  • 确保你也重建了静态库
于 2009-07-04T10:30:31.463 回答