zoukankan      html  css  js  c++  java
  • 在VC++应用程序中读取文本数据

    作者:朱金灿

    来源:http://blog.csdn.net/clever101


    我们通常把数据存诸在txt文件上,但是我们通常要把这些数据取出来并进行处理。下面我将介绍一种在VC++应用程序中读取文本数据的方法。

    一.前言

    因为经常要处理地质方面的数据。但是很多数据它不是直接存贮在数据库文件(如Access文件等),而是存贮在txt文件。经常有同学问我怎么通过编程读取实现文本文件中的数据。其实存贮在txt文件也有它的好处,不像读取Access文件那样要注册数据源,设置比较麻烦,编写读取程序也比较复杂。

     

    二.程序原理

    首先我们知道假如要进行的文件操作只是简单的读写整行的字符串,那么最好使用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

    三.编程步骤

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

     

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

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

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

    CArray<CPoint,CPoint> 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<m_PointNum;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<m_PointNum-1;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

     

    三.小结

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

  • 相关阅读:
    Hrbust-1492 盒子(二分图最大匹配)
    数据结构——二叉树的建立和遍历(递归建树&层序遍历建树)
    HDU 1710 二叉树遍历
    HDU 2891
    HDU 2895 贪心 还是 大水题
    POJ 2896 另解暴力
    POJ 2896 AC自动机 or 暴力
    HDU 1714 math
    POJ 1328 贪心
    POJ 2109 巧妙解法
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6471327.html
Copyright © 2011-2022 走看看