Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5832791
  • 博文数量: 671
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 7310
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-14 09:56
文章分类

全部博文(671)

文章存档

2011年(1)

2010年(2)

2009年(24)

2008年(271)

2007年(319)

2006年(54)

我的朋友

分类: C/C++

2009-01-07 17:05:21

在VC++应用程序中读取文本数据
2008-11-28 11:36

1。程序原理

首先我们知道假如要进行的文件操作只是简单的读写整行的字符串,那么最好使用CStdioFile,用它来进行此类操作非常方便。因此我们便很自然想到:首先我们把文本文件的每行数据读到一个缓冲区,然后使用sscanf把它转化为字符格式。

那么具体该怎么做呢?比如在一个txt文件里每一行数据格式是这样的:

A1 A2 A3 A3 ......An

那么读取的主体代码是:

CStdioFile File;    // 定义一个CStdioFile类变量File

CString FileData; // 定义一个CString,作为一个缓冲区

/*定义n个临时字符串变量,大小依据实际情况,这里暂设为10

*/

char TempStr1[10],TempStr2[10]......TempStrN[10];

File.ReadString(FileData); // 将一行数据读到缓冲区

/*将该行数据的n个字符读到n个临时字符串变量*/

sscanf(FileData,"%s %s %s %s ......%s",TempStr1,TempStr2......TempStrN);

     这种读法的一个好处是对文本格式要求不严,如下面的格式也可以
(前面可有未知个空格) A1 A2 (两个数据之间也可有未知个空格) A3 A3 ......An

2.编程步骤

下面我以一个单文档程序来具体说明我的做法。该程序的主要功能是读取文本文件的坐标数据,然后在客户区里用直线将这些坐标连起来,并显示。

1、 启动Visual C++6.0,生成一个单文档的工程,将该工程命名为ReadCoodinate。

2、 添加一个“读取文本数据”的菜单项。

3、 给视图类添加两个public变量:

CArray m_PointArray; // 用于记录坐标点数据

int m_PointNum;   // 用于记录坐标点个数,在视图类构造函数中初始化为0。

4、 给“读取文本数据”添加相应的单击消息响应函数。代码如下:

void CReadCoodinateView::OnReaddata()

{

       // TODO: Add your command handler code here

       CFileDialog dlg(TRUE); // 定义一个文件对话框变量

       if(dlg.DoModal()==IDOK)  

       {

       CString m_FilePath = dlg.GetPathName(); //取得文件路径及文件名

       CStdioFile File;

       File.Open(m_FilePath,CFile::modeRead); //以读模式打开文本文件

   CString FileData;        //定义一个CString变量作为缓冲区

   File.ReadString(FileData);//读取第一行数据,第一行数据为坐标点数据

   /*定义两个临时字符串,并初始化为'\0'*/

   char TempStr1[10];

   char TempStr2[10];

   memset(TempStr1,'\0',10);

   memset(TempStr2,'\0',10);

   sscanf(FileData,"%s",TempStr1);

   m_PointNum = atoi(TempStr1);   // 获取坐标点个数

   /*逐行读取坐标数据*/

   for (int i = 0;i

   {

      File.ReadString(FileData);

         sscanf(FileData,"%s %s",TempStr1,TempStr2);

         m_PointArray.Add(CPoint(atoi(TempStr1),atoi(TempStr2)));//将其存入坐标点数组

   }

   

   CDC *pDC = GetDC(); //获取设备环境;

   /*根据坐标点绘出直线*/

   for (i = 0;i

   {

  

        pDC->MoveTo(m_PointArray[i].x,m_PointArray[i].y);

        pDC->LineTo(m_PointArray[i+1].x,m_PointArray[i+1].y);

     

   }

ReleaseDC(pDC); //使用完后,释放设备环境

       }

}

程序运行结果的效果图如下:

1.选取一个txt文件

2.单击确定后绘制直线,如下图:

其中示例数据文件的格式是这样的:(第一行为坐标个数,余下的是坐标点数据)

5

10 20

30 40

45 85

100 120

200 300

这个程序的一个优点是对文本数据格式并不严格,你可以把数据编辑成下面形式,但读出来的效果是一样的,(只要x坐标和y坐标中间有一个空格就可以了)

5

             10        20

   30        40

45                 85

100                        120

200         300

三.小结

上面只是小小的示例,读者朋友可以将文本数据传化为其它形式的数据(如将字符型数据转化为浮点型),进行更复杂的数据处理,其中原理是一样的。上面程序的编译环境是:Win2000,VC++6.0。

阅读(1709) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~