-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

is.open(fileName); がない理由

標準ライブラリの最新の実装を使用すると、まさにそれを行うことができますし、行う必要があります。operator>>()(実際には、入力演算子でユーザー入力を受け入れてファイルを開くべきではありistreamませんifstream

標準ライブラリの古いバージョンでは、C++ スタイルではなく、Cifstream::open(filename)スタイルの文字列 (ゼロで終わるchar配列へのポインタ) を引数として取りましたstd::string。したがって、C++ 文字列を使用するには、C 文字列に変換する必要がありましたfilename.c_str()

data()ではなく使用するのc_str()は間違っています。必ずしも適切に終了した文字列を提供するとは限りません。そうでない場合、それを 1 つとして処理しようとすると、未定義の動作が発生します。

于 2012-11-14T03:56:30.283 に答える
1

ここで質問するにGoogleで検索するよりも良かったと思います。

文字列データの取得 文字列と同じ内容の文字配列へのポインタを返します。

終端の null 文字が追加されていないことに注意してください (このような機能については、メンバー c_str を参照してください)。

返された配列は、プログラムで直接変更してはならない内部の場所を指しています。その内容は、文字列オブジェクトの非定数メンバー関数が次に呼び出されるまで変更されないことが保証されています。

于 2012-11-14T01:30:16.000 に答える
0

埋め込まれた 0 を含む完全な文字列データを返します。 は、末尾の 0filename.c_str()までの文字列のみを返します。

ところで、変数の大文字と小文字が異なるため、コード フラグメントはコンパイルされません。

于 2012-11-14T01:33:16.077 に答える