2D配列を出力ファイルに書き込もうとしていますが、ファイルから配列を描画する.getline関数を作成する場合を除いて、すべて正常に機能しています。私の問題は文字列の長さを置くことです。この行の現在のコードは次のとおりです。
inputFile.getline(myArray、[10] [10]、'\ n');
しかし、文字列の長さを角かっこで囲むのは好きではないようです。どうすればよいですか?
前もって感謝します
2D配列を出力ファイルに書き込もうとしていますが、ファイルから配列を描画する.getline関数を作成する場合を除いて、すべて正常に機能しています。私の問題は文字列の長さを置くことです。この行の現在のコードは次のとおりです。
inputFile.getline(myArray、[10] [10]、'\ n');
しかし、文字列の長さを角かっこで囲むのは好きではないようです。どうすればよいですか?
前もって感謝します
コンパイルするにmyArray
は、 の配列char
、またはchar*
. 特に、これは1 次元配列です。複数のディメンションを読み取るには、各行を個別に読み取る必要があります。の 2 番目のパラメータstd::istream::getline
は、読み取って配列に格納する の最大数char
から 1 を引いた値です。
ファイルから何かを読み取るには、最初にファイルがどのように書き込まれたかを知ることから始めなければなりません。ファイルがどのように作成されたかはご存知だと思いますが、質問ではそれについて説明していません。ファイルから読み取る方法を知るには、ファイルがどのように書き込まれたかを知ることが不可欠です。いくつかのコードを表示してください。
Rob Kennedyに敬意を表して、彼は C/C++ が多次元配列を処理する方法を誤って伝えています。
int foo[10][10] と int foo[100] を考えてみましょう。どちらの場合も、foo は sizeof(int)*100 バイトを含むメモリ ブロックへのポインタです。
int *pointer と int foo[10][10] には微妙な違いがあります。特に sizeof() および特定のコンパイラ固有のエラー チェックに関して。ただし、必要に応じて、それらを同じ意味で扱うことができます。
つまり、leachrodeはgetline()の引数 2 を"[10][10]"として渡すことはできません。彼は"10*10*sizeof(foo)"を渡すことができます。ここで、foo はmyArrayの型です。実際に配列として宣言されている場合、彼はsizeof(myArray)を渡すこともできます。
変数myArrayは必ずしもchar型である必要はありません。ただし、そのgetline()呼び出しが機能する場合、myArray データ ブロック内のどのバイトも値 '\n' を持つことはできません。
個人的には、バイナリ ストレージを使用します。例: ( inputFileが iostream オブジェクトであると仮定します。)
inputFile.write( (const char *)myArray, sizeof(myArray) );
inputFile.read( (char *)myArray, sizeof(myArray) );
*ただし*、これは、バイナリ互換システムで読み書きしていることを前提としています。コンパイラがその配列をメモリに格納する方法について仮定しています。コンパイラが異なれば、処理が異なる場合があります。パディングとアラインメントの問題は、クロスプラットフォームの悪夢を引き起こす可能性があります.
移植性と将来のメンテナンスの観点から、各配列要素を個別に読み書きする方が良いでしょう! コード的にはそれほど複雑ではありません。速度に関しては、iostreams はバッファリングされ、とにかくディスク io に拘束されます...
参考:http ://www.cplusplus.com/reference/iostream/
後付け: - IF myArray が基本型 (int[]、double[]) ではなく、代わりにオブジェクト (仮想メンバーを含む) またはポインターの配列を表す場合、シリアル化の手段が必要になります。ポインターは、読み戻されるときに有効なメモリを指しません。