找回密码
 注册
Simdroid-非首页
查看: 287|回复: 7

[2. C/C++/C#] 这样的数据文件,怎么用VC++读入呀

[复制链接]
发表于 2005-7-4 20:44:32 | 显示全部楼层 |阅读模式 来自 北京
这样的数据文件,怎么用VC++读入呀?
附件为一个用其他软件生成的一个数据文件,想用vc++对其进行计算处理,可是不知道怎么作为一个矩阵,导入vc++
那位大侠有这方面的程序呀?
或能否帮俺做一个程序呀/
谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2005-7-4 20:53:19 | 显示全部楼层 来自 黑龙江哈尔滨

Re:这样的数据文件,怎么用VC++读入呀

Simdroid开发平台
//////////////////////////////////////////////////////////////////////////////////////////////////
// The purpose of this class is to read a 2 dimensional table from a file
// 2005.5.9, violetwind
//////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once
#include <afxtempl.h>  // for CArray

class CTable2
{
public:
  CTable2(void){  m_nColumns  = m_nRows  = 0;  m_strSeparators  = " \t";};
  ~CTable2(void){};
  bool      SetFile(CString filename, CString* pLastLine = NULL);
  inline void    SetSeparators(CString strSeparators){ m_strSeparators = strSeparators;}

  double      GetAt(int row, int col);

private:
protected:
  int        FindSeparatorPosition(CString str);
  int        m_nColumns;
  int        m_nRows;

  CString      m_strSeparators;
  CString      m_strFile;
  
  CArray<double, double> m_array;

  // split a string into array, according to the m_strSeparators
  // the return value is the size of the array
  int      SplitString(CString str, CArray<double, double>& array);

public:

  bool   &nbsprint2File      (CString filename);
  bool    PrintRow2File    (int row, CString filename);
  bool    PrintColumn2File  (int col, CString filename);

  // get a row and a column from the table, the index starts from 0
  // i.e. the first row has the row index of 0
  void    GetRow        (int row, CArray<double, double>& array);
  void    GetColumn      (int col, CArray<double, double>& array);
};

评分

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;
}
发表于 2005-7-4 20:57:50 | 显示全部楼层 来自 黑龙江哈尔滨

Re:这样的数据文件,怎么用VC++读入呀

这是我曾经做过的一个类,用来读入二维数据表格的
用的时候先SetFile,数据就保存了
取数据用GetAt(row,col)即可(zero based index)
 楼主| 发表于 2005-7-5 08:28:54 | 显示全部楼层 来自 北京

Re:这样的数据文件,怎么用VC++读入呀

我做的第一列是整数,而其它各列是双精度的,我想用一个结构来处理,可是不行呀,有没有直接想 V Fortran 那样的函数可以直接读行呀。
俺是v c++新手,望高手给予指点呀
发表于 2005-7-5 09:04:34 | 显示全部楼层 来自 黑龙江哈尔滨

Re:这样的数据文件,怎么用VC++读入呀

更简单点的,用
FILE* pf;
pf = fopen("file","r");
fscanf(pf, "%d  %f  %f", &a, &b, &c);//"%d  %f  %f"的格式要与你的文件格式一致
 楼主| 发表于 2005-7-5 12:00:48 | 显示全部楼层 来自 北京

Re:这样的数据文件,怎么用VC++读入呀

violetwind ,大侠感谢您的帮助,可是我还是没有做出来呀
您能否帮俺做个相应的程序呢?谢谢
由于刚开始学习,望大侠多帮助
谢谢
发表于 2005-7-8 11:23:29 | 显示全部楼层 来自 湖北武汉

Re:这样的数据文件,怎么用VC++读入呀

void main()
{
int a;
double b,c;
FILE* pf;
pf = fopen("file","r");
for(int i=0;i<121;i++)
{
fscanf(pf, "%d %f %f", &a, &b, &c);//"%d %f %f"的格式要与你的文件格式一致
}
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-2 01:31 , Processed in 0.057264 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表