- ベストアンサー
テキストファイルの内容を配列に格納したい
<プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問> テキストファイルの内容(数字)を読み込み、double[][]に格納 する方法はありますか? 以下のソースではxxx.txtの内容をCStringで取得・表示できたのですが、 文字を数字に変換し、数字を一つずつdouble[][]に格納したいです。 例えば double[0][0] = 0; double[0][1] = 1; double[1][2] = 5; のように格納したいです。 <現時点でのソース> void CMyDlg::OnReadText() { CString csBuf; CStdioFile ifp; m_Display = "";//m_Displayはエディットボックスのメンバ変数 if(ifp.Open("xxx.txt",CFile::modeRead)==NULL) return; while(TRUE){ if(ifp.ReadString(csBuf)==NULL) break; m_Display += csBuf + "\r\n"; } UpdateData(FALSE);UpdateWindow(); ifp.Close(); } <xxx.txt> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 数字はタブで間隔が開いています。 宜しければご指摘お願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
sscanfなどで取り込む方法でしょう double rowData[3]; などと宣言しておいて sscanf( cbBuf, "%lf %lf %lf", &rowData[0],&rowData[1],&rowData[2]); といった具合に取り込みます 動的な配列に読み込むのであれば double **myData = NULL; int n = 0; などと宣言しておきます ループの中で if ( myData == NULL ) { myData = (double**)malloc( sizeof(double*) ); myData[0] = (double*)malloc( sizeof(double)* 3 ); } else { n++; // 確保した領域を拡張する myData = (double**)remalloc( myData, sizeof(double*) * ( n + 1 ) ); myData[n] = (double*)malloc( sizeof(double)* 3 ); } sscanf( cbBuf, "%lf %lf %lf", &myData[n][0], &myData[n][1], &myData[n][2]); といった具合に取り込みます 使い終わった動的に確保した領域の後始末 for( int i = 0; i < n + 1; i++ ) { // 2次元目の要素を開放 free( myData[n] ); } // 1次元目を開放 free( myData );
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
CArrayを使うなら typedefで列要素を定義するより Class定義を行って=演算子を定義してやった方が行の追加が Addだけで記述できると思います Class CDoubleArray : public CArray<double,double> { public: CDoubleArray& operator=( CDoubleArray& src ) { for( int n = 0; n < src.GetSize(); n++ ) { this->Add( src[n] ); } return *this; } }; といった定義にしておきます #2氏の > m_adData[line].SetSize(adBuff.GetSize(), GROWBY); > for (int i=0; i<adBuff.GetSize(); i++) { > m_adData[line][i] = adBuff[i]; > } 部分が m_adData.Add( adBuff ); といった記述が可能です 先頭付近の > typedef CArray<double, double> CDoubleArray; は前述のクラス定義に置き換えます
お礼
有難うございました。 まだまだ未熟者で、書かれているコードの意味が理解できませんでした。sscanfを使いました。
MFCのCArrayクラスを使ってみてはいかがでしょうか。 ---.h------------------------------------- #define GROWBY 10 typedef CArray<double, double> CDoubleArray; CArray<CDoubleArray, CDoubleArray&> m_adData; ---.cpp------------------------------------- CString strBuff; CStdioFile ifp; if(ifp.Open(m_strFile, CFile::modeRead)==NULL) return; for (int line=0; ifp.ReadString(strBuff); line++) { m_adData.SetSize(line+1, GROWBY); CDoubleArray adBuff; while (TRUE) { strBuff.TrimLeft(); CString strData = strBuff.SpanExcluding("\t "); if (strData.IsEmpty()) break; adBuff.Add(atof(strData)); strBuff = strBuff.Mid(strData.GetLength()); } m_adData[line].SetSize(adBuff.GetSize(), GROWBY); for (int i=0; i<adBuff.GetSize(); i++) { m_adData[line][i] = adBuff[i]; } } ifp.Close(); ---参照方法------------------------------------- for (int l=0; l<m_adData.GetSize(); l++ ) { for (int j=0; j<m_adData[l].GetSize(); j++) { TRACE("m_adData[%d][%d] = %lf\n", l, j, m_adData[l][j]); } }
お礼
有難うございました。 まだまだ未熟者で、書かれているコードの意味が理解できませんでした。sscanfを使いました。
お礼
有難うございました。 sscanfを使って取り込むことが出来ました。 動的に配列に読み込む方法も教えて頂き有難うございました。