我试图理解这段重载运算符>>
的代码。我想我不明白的是为什么没有
is.open(fileName);
代替is.open(fileName.data());
。
或者fileName.data()
的确切功能是什么。
ifstream& operator>> (ifstream& is, TheMatrix& myMatrix)
{
string fileName;
cout << "Enter a file name -> ";
cin >> fileName;
is.open(fileName.data());
for (int i=0; i< 5; i++)
for (int j=0; j<5; j++)
is >> myMatrix.M[i][j];
return is;
}
由于
答案 0 :(得分:1)
我想在谷歌之前搜索 之前在这里询问它会更好。
获取字符串数据 返回指向与字符串具有相同内容的字符数组的指针。
请注意,不会附加终止空字符(请参阅成员c_str以获取此类功能)。
返回的数组指向一个不应在程序中直接修改的内部位置。它的内容保证在下一次调用字符串对象的非常量成员函数之前保持不变。
答案 1 :(得分:0)
它返回包含任何嵌入式0的完整字符串数据。filename.c_str()
将仅返回字符串,直到任何终止0。
顺便说一句,代码片段将无法编译,因为变量具有不同的大小写。
答案 2 :(得分:0)
为什么没有is.open(fileName);
使用标准库的现代实现,您可以而且应该做到这一点。 (虽然你真的不应该接受用户输入并在输入操作符中打开文件;对于更通用的operator>>()
而不是istream
重载ifstream
会更有意义。 )
在旧版本的标准库中,ifstream::open(filename)
采用了C风格的字符串(指向零终止char
数组的指针)作为其参数,而不是C ++风格的{{1} }}。因此,要使用C ++字符串,需要将其转换为C字符串:std::string
。
使用filename.c_str()
而不是data()
是错误的。它不一定会给出一个正确终止的字符串,如果不是,如果你试图把它当作一个字符串,你就会得到未定义的行为。