我有一个代码:
#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 ++。我做错了什么?
答案 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;
。谢谢:))