【问题标题】:Reading a file - won't open读取文件 - 无法打开
【发布时间】:2011-11-19 04:50:32
【问题描述】:

我正在尝试在 C++ 中打开一个文件,但这似乎给我带来了一些麻烦,这里是目前处理打开文件的代码:

void CreateHistogram(string str_file, vector<HistogramWord> &result) {
    string line;
    long location;
    HistogramWord newWord;
    const char * filename = str_file.c_str();

    //ifstream myfile (str_file.c_str());
    ifstream myfile (filename);
    //myfile.open(filename);
    if (myfile.is_open()) {
        while (myfile.good()) {
            getline(myfile, line);
            line = clarifyWord(line);

好的,只是为了解释一下,HistogramWord 是一个在标题中定义的结构,从我在在线文档中阅读的内容来看,文件名必须是 const char * 类型,所以这就是我所拥有的完毕。将str_file 转换为const char *

现在,我尝试了一些不同的方法,这就是为什么有些代码被注释掉了。当它到达if (myfile.is_open()) 行时,它总是评估为假。有人知道为什么吗?

谢谢, 布兰登

【问题讨论】:

  • 是的,它确实存在并且与主函数在同一目录中,所以我应该可以将其称为“test.txt”,对吗?
  • 我也刚刚尝试了 myfile.open(filename); 未注释但它仍然不想工作:/
  • 请打印文件名并将其复制到您的地址栏或资源管理器或您正在使用的任何工具,并验证文件是否存在。
  • 就在阅读您的评论 FailedDev 之前,我发现一个网站解释了如果您不输入完整的文件路径,它将与实际位于 TEMP 文件夹中的目标文件位于同一目录中在 Windows 上。它没有进入 if 语句,所以文件是打开的。然而,不工作的行是while (myfile.good()) {,它没有进入那个循环。如果没有这个while循环,还有其他方法可以读取文件的内容吗?这似乎不是很充分的证据。
  • @Brandon - 无论如何,只需执行while (std::getline(...)),它会返回一个istream which is overloaded,因此您可以这样使用它。 (顺便说一句:我假设你的意思是万无一失?)

标签: c++ file-io text-files


【解决方案1】:

为我解决的问题是在我的文件路径中使用正斜杠而不是双反斜杠。

例如

inFile.open("path/to/file.txt")

而不是

inFile.open("path\\to\\file.txt")

【讨论】:

    【解决方案2】:

    OK IO 101

    如果您不提供完整的文件路径而只提供文件名,则当前工作目录将附加到文件名中。

    因此,如果您的 .exe 在 C:\temp 中,并且您从该目录调用程序并且文件名是 test.txt,那么在这种情况下完整的文件名将是 C:\temp\test.txt

    这只有在 .exe 和 test.txt 都在 C:\temp 下时才有效。

    在所有其他情况下,它都会失败。您可以使用 win API 或 linux 等价物创建绝对路径 - 我不知道您使用的是什么平台。

    现在为了读取一个成功打开的文件,这就足够了:

    void CreateHistogram(string str_file, vector<HistogramWord> &result) {
    string line;
    long location;
    HistogramWord newWord;
    
    ifstream myfile (str_file.c_str());
    if (myfile.is_open()) {
        while (getline(myfile, line)) {
            line = clarifyWord(line);
    }
    else{
       //throw exception, print error message etc
       throw std::exception(std::string("Couldn't open file : " + str_file).c_str());
    }
    }
    

    编辑:谢谢@Shahbaz

    【讨论】:

    • 其实它需要在你调用.exe文件的目录下。因此,如果您在目录 C:\ 中并调用 temp\test.exe,它希望它位于 C:\ 而不是 C:\temp
    【解决方案3】:

    我最好的猜测是 Windows 正在“隐藏已知文件类型的扩展名”,因此文件名实际上与您在 Windows 中输入的名称不同。例如,如果它是一个 .txt 文件,并且您将其命名为 test.txt,那么实际名称将是 test.txt.txt,这是 windows 所做的一件非常愚蠢的事情。

    要更改此设置,请转到我的电脑 -> 已工具 -> 文件夹选项 -> 并取消选中“隐藏已知文件类型的扩展名”框。这是针对 XP 的。如果您有另一个窗口,它应该或多或少是相同的路径。如果您没有看到工具栏,请尝试 ALT+t(工具)或 ALT+f(文件)使其出现。

    这个问题在大学第一学期给我们很多人带来了麻烦。

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 2022-08-13
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多