无法将整个文件读入字符串

时间:2017-04-30 15:09:37

标签: c++ c++11

我有一个代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {
    ifstream file;

    do {
        string filename;
        cout << "Input file name:" << endl;
        cin >> filename;
        file.open(filename, ios::in);
    } while (!file.is_open());

    string content(istreambuf_iterator<char>(file),
                   istreambuf_iterator<char>());

    cout << "Content:\n" << content << endl;

    if (file.is_open()) {
        file.close();
    }

    return 0;
}

要阅读此文件内容:

 1 -1  0 -3  0
-2  5  0  0  0
 0  0  4  6  4
-4  0  2  7  0
 0  8  0  0 -5

但它仅输出1和新行 附:我是一个nobie,只是通过样本学习C ++。我做错了什么?

1 个答案:

答案 0 :(得分:7)

哇,这是一个偷偷摸摸的人!

Coliru上编译代码会产生此警告:

string content(istreambuf_iterator<char>(file),
               istreambuf_iterator<char>());

地址?什么地址??好吧,如果仔细观察这个括号内的混乱并眯着眼睛,你最终会注意到:

content

......实际上......是一个功能声明!具体来说,是一个名为std::istreambuf_iterator<char>的函数,它采用std::string类型的两个参数并返回std::cout << content;。 事实上,1获取此函数的地址并将其转换为布尔值,产生string content{istreambuf_iterator<char>{file}, istreambuf_iterator<char>{}}; 和公平警告。

这个问题被称为&#34;最令人烦恼的解析&#34;。这是使用统一初始化的原因之一,如下所示:

content

不再存在语法歧义,std::string现在是一个实际的data.txt,一切正常。

但请花点时间unlearn using namespace std;。谢谢:))