• ベストアンサー

テキストファイルの内容を配列に格納したい

<プログラム環境> 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 数字はタブで間隔が開いています。 宜しければご指摘お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

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 );

meeyooyoo
質問者

お礼

有難うございました。 sscanfを使って取り込むことが出来ました。 動的に配列に読み込む方法も教えて頂き有難うございました。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

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; は前述のクラス定義に置き換えます

meeyooyoo
質問者

お礼

有難うございました。 まだまだ未熟者で、書かれているコードの意味が理解できませんでした。sscanfを使いました。

noname#75489
noname#75489
回答No.2

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]); } }

meeyooyoo
質問者

お礼

有難うございました。 まだまだ未熟者で、書かれているコードの意味が理解できませんでした。sscanfを使いました。

関連するQ&A