-4

我试图理解这段使 operator 过载的代码>>。我想我不明白的是为什么不拥有 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;

}

谢谢

4

3 回答 3

1

我想比在这里询问之前在谷歌上搜索它会更好。

获取字符串数据 返回一个指向与字符串内容相同的字符数组的指针。

请注意,没有附加终止空字符(有关此类功能,请参见成员 c_str)。

返回的数组指向不应在程序中直接修改的内部位置。它的内容保证仅在下一次调用字符串对象的非常量成员函数之前保持不变。

于 2012-11-14T01:30:16.000 回答
1

为什么没有 is.open(fileName);

使用标准库的现代实现,您可以而且应该做到这一点。(尽管您真的不应该接受用户输入并在输入运算符中打开文件;重载operator>>()更通用istream而不是ifstream.)

在标准库的旧版本中,ifstream::open(filename)将 C 风格的字符串(指向以零结尾的char数组的指针)作为参数,而不是 C++ 风格的std::string。因此,要使用 C++ 字符串,您需要将其转换为 C 字符串:filename.c_str().

使用data()而不是c_str()错误的。它不一定给出正确终止的字符串,如果没有,如果您尝试将其视为一个,您将获得未定义的行为。

于 2012-11-14T03:56:30.283 回答
0

它返回完整的字符串数据,包括任何嵌入的 0。filename.c_str()将只返回直到任何终止 0 的字符串。

顺便说一句,代码片段不会编译,因为变量有不同的大小写。

于 2012-11-14T01:33:16.077 回答