debugging Windows标准::ifstream::open()问题

c0vxltue  于 2022-11-14  发布在  Windows
关注(0)|答案(3)|浏览(188)

我知道有一些关于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]中获取的完整的绝对路径。
我哪里出了问题,我需要做什么来修复它?

nqwrtyyt

nqwrtyyt1#

1.请创建一个最小集合来重现问题。例如,在上面的代码中,有对argv和字符串连接的解析,这似乎不是问题的必要部分。一个最小集合将帮助您(和我们)确切地看到哪里出了问题,而不是被诸如“GetPath()是什么?"之类的问题分心。
1.尝试执行此操作,而不是assert(infile.good())
assert(文件中);

vc6uscn9

vc6uscn92#

我已经注意到了这样一个事实的重要性,即所讨论的函数在没有检查它是否为is_open()的情况下就将close() d流。
事实上,它将设置流的fail_bit(导致它求值为false)对我来说是全新的(这并不是一个借口),我仍然不明白为什么这段代码以前能工作。
不管怎么说,C++参考对它是相当清楚的;现在问题解决了。

tv6aics1

tv6aics13#

下面的代码:

#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得问题:

  • 仅使用命令行生成
  • 请确保也重建静态库

相关问题