C++ 中的 is_open() 函数总是 return 0 值而 getLine(myFile, line) 不 return 任何东西

is_open() function in C++ always return 0 value and getLine(myFile, line) does not return anything

正在尝试使用 fstream 在 C++ 中读取文件。 但是 is_open() 函数总是 return 0 结果并且 readline() 不读取任何内容。请参阅下面的代码片段。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    string line;
    ifstream myfile("D:\xx\xx\xx\xx\testdata\task1.in.1");
    if (myfile.is_open()) {
        while (getline(myfile, line)) {
            cout << line << '\n';
        }
        myfile.close();
    }

    else
        cout << "Unable to open file";

    return 0;
}

你认为你正在打开 D:\<somepath>\testdata\task1.in.1

但实际上您正在尝试打开 D:\<somepath><tabulation char>estdata<tabulation char>ask1.in.1,因为 \t 被解释为表格。

(比如 \nprintf("hello world\n"); 中的换行符)

\x 也很特别,顺便说一句,这不是真正的路径,否则您会遇到另一个错误:error: \x used with no following hex digits 可能会更好地与您交谈!)

你必须像这样转义反斜杠:

D:\xx\xx\xx\xx\testdata\task1.in.1

Windows 也接受这样的路径,更方便,除非您想使用 cd 命令生成批处理脚本或需要反斜杠的类似命令(/ 用作选项在批处理命令中切换):

D:/xx/xx/xx/xx/testdata/task1.in.1

正如 NathanOliver 所说,如果您的编译器启用了 C++11 模式(或 --std=c++11),您可以使用 raw 前缀

R"(D:\xx\xx\xx\xx\testdata\task1.in.1)"

最后一句话:肮脏的逃避方式:

D:\Xx\Xx\Xx\Xx\Testdata\Task1.in.1

在那种情况下使用大写就可以了

  1. 因为 windows 不区分大小写
  2. C 会让反斜杠保持原样。

但这只是运气。很多人在没有意识到他们非常接近错误的情况下这样做了。 顺便说一句,很多人将 windows 路径大写(正如在本网站中经常看到的那样),因为他们注意到他们的路径在不知道为什么的情况下不能使用小写字母。