- 积分
- 10
- 注册时间
- 2005-5-7
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2005-7-4 20:54:53
|
显示全部楼层
来自 黑龙江哈尔滨
Re:这样的数据文件,怎么用VC++读入呀
//////////////////////////////////////////////////////////////////////////////////////////////////
// implementation of the template
// 2005.5.9, violetwind
//////////////////////////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "Table2.h"
bool CTable2::SetFile(CString filename, CString* pLastLine)
{
  m_strFile  = filename;
  CStdioFile  file;
  if( file.Open(filename, CFile::modeRead) == 0 )
    return false;
  // everytime a file opens, remove all the previous contents in the data array
  m_array.RemoveAll();
  CString    line;
  file.ReadString(line);
  CArray<double, double>  row;
  // read the first line, to get the column number of the table
  m_nColumns  = SplitString(line, row);
  m_nRows    = 0;
  if( m_nColumns  == 0 )
  {
    file.Close();
    return true;
  }
  m_array.Append(row);
  m_nRows  ++;
  // now read the rest of the table
  while(file.ReadString(line))
  {
    row.RemoveAll();
    // make sure every row has the same column number
    // otherwise terminate the reading process
    if( SplitString(line, row) != m_nColumns )
      break;
    m_array.Append(row);
    m_nRows  ++;
  }
  // store the last line
  if( pLastLine  != NULL )
    *pLastLine  = line;
  file.Close();
  return true;
}
double CTable2::GetAt(int row, int col)
{
  int  index  = row * m_nColumns + col;
  if( index < m_array.GetSize() )
    return m_array.GetAt(index);
  else
    return 0.0;
}
int CTable2::FindSeparatorPosition(CString str)
{
  int  pos  = -1;
  int  len  = m_strSeparators.GetLength();
  
  for(int i = 0; i < len; i++)
  {
    pos  = str.Find( m_strSeparators.GetAt(i) );
    if ( pos != -1 )
      return pos;
  }
  return -1;
}
int CTable2::SplitString(CString str, CArray<double, double>& array)
{
  str.Trim();
  CString  word;
  int pos    = FindSeparatorPosition(str);
  int  size  = 0;
  while(pos != -1)
  {
    size  ++;
    word  = str.Left(pos);
    array.Add(atof(word));
    str    = str.Right(str.GetLength() - pos - 1);
    str.Trim();
    pos    = FindSeparatorPosition(str);
  }
  if( ! str.IsEmpty() )
  {
    array.Add( atof(str) );
    size ++;
  }
  return size;  
}
bool CTable2:rint2File(CString filename)
{
  CStdioFile  file;
  if( file.Open(filename, CFile::modeCreate|CFile::modeWrite) == 0 )
    return false;
  int  i, j;
  CString  word, line;
  for( i = 0 ; i < m_nRows; i++)
  {
    line.Empty();
    for( j = 0; j < m_nColumns; j++)
    {
      word.Format("%e\t", GetAt(i, j));
      line  += word;
    }
    line  = line.Left( line.GetLength() - 1 );
    line  += "\n";
    file.WriteString( line );
  }
  file.Close();
  return true;
}
void CTable2::GetColumn(int col, CArray<double, double>& array)
{
  if( col >= m_nColumns )
    col  = col % m_nColumns;    // take the modulus if col greater than the column size
  for( int i = 0; i< m_nRows; i++)
    array.Add( m_array.GetAt( col + i * m_nColumns ) );
}
void CTable2::GetRow(int row, CArray<double, double>& array)
{
  if( row >= m_nRows )
    row  = row % m_nRows;    // take the modulus if row greater than the row size
  for( int i = 0; i < m_nColumns; i++)
    array.Add( m_array.GetAt( row * m_nColumns + i ) );
}
bool CTable2::PrintRow2File(int row, CString filename)
{
  CStdioFile  file;
  if( file.Open(filename, CFile::modeCreate|CFile::modeWrite) == 0 )
    return false;
  CArray<double, double> row_array;
  GetRow(row, row_array);
  CString  word, line;
  if(row_array.GetSize() != m_nColumns)
  {
    file.Close();
    return false;
  }
  for( int i = 0; i < m_nColumns; i++ )
  {
    word.Format("%e\t", row_array.GetAt(i));
    line  += word;
  }
  line  = line.Left(line.GetLength() - 1);
  line  += "\n";
  file.WriteString(line);
  file.Close();
  return true;
}
bool CTable2::PrintColumn2File(int col, CString filename)
{
  CStdioFile  file;
  if( file.Open(filename, CFile::modeCreate|CFile::modeWrite) == 0 )
    return false;
  CArray<double, double> col_array;
  GetColumn(col, col_array);
  CString  line;
  if(col_array.GetSize() != m_nRows)
  {
    file.Close();
    return false;
  }
  for( int i = 0; i < m_nRows; i++ )
  {
    line.Format("%e\n", col_array.GetAt(i));
    file.WriteString(line);
  }
  file.Close();
  return true;
} |
|