一回も披露したことのない豆知識

<プログラム環境>
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
数字はタブで間隔が開いています。

宜しければご指摘お願い致します。

A 回答 (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 );
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/24 19:39

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;
は前述のクラス定義に置き換えます
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/24 19:38

MFCのCArrayクラスを使ってみてはいかがでしょうか。



---.h-------------------------------------
#defineGROWBY10
typedef CArray<double, double>CDoubleArray;
CArray<CDoubleArray, CDoubleArray&>m_adData;

---.cpp-------------------------------------
CStringstrBuff;
CStdioFileifp;

if(ifp.Open(m_strFile, CFile::modeRead)==NULL) return;
for (int line=0; ifp.ReadString(strBuff); line++) {
m_adData.SetSize(line+1, GROWBY);

CDoubleArrayadBuff;
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]);
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/24 19:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報