c++ - C++ 中的 is_open() 函数始终返回 0 值,而 getLine(myFile, line) 不返回任何内容

标签 c++ file-io cygwin fstream

尝试使用 fstream 在 C++ 中读取文件。 但是 is_open() 函数始终返回 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 路径大写(正如在本网站中经常看到的那样),因为他们注意到他们的路径在不知道为什么的情况下不能使用小写字母。

关于c++ - C++ 中的 is_open() 函数始终返回 0 值,而 getLine(myFile, line) 不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39154374/

相关文章:

C++字符替换

c - 如何打开与程序位于同一目录中的 c 文件?

svn - 如何在 Cygwin 中使用 svn 命令

c++ - std::thread 在 cygwin 中有效,但在 MinGw 中无效

java - Win 7下无法在Cygwin中启动Marathon测试

c++ - visual studio 2015 clr form deigner 无法从文件加载 ui

c++ - 如何以编程方式隐藏外部程序的窗口?

c++ - gcc vs clang 在具有可变参数和相同类型的额外参数的部分特化上的行为

用于将 TXT 读入 hashmap 的 java 类

c - C 中文件的输入和输出