一个文本文件的内容如下:////////
//若干文字,都是用来说明的文字
//////// 4, 500, 10 0,5,7,13,17,20,23,26,32,35,
40,45,47,50,53,57,61,65,67,72,
75,78,82,85,88,92,96,100,104,106,
110,112,116,120,123,125,129,132,136,140,
142,145,150,153,157,160,162,165,167,173,
175,177,179,183,187,190,193,196,198,200,
203,205,207,209,212,215,217,219,221,223,
225,227,229,231,233,235,237,239,241,243,
246,248,250,252,254,256,258,260,262,264,
266,268,269,270,272,273,274,275,276,277,       
278,279,280,281,282,283,284,285,286,287,
288,289,290,291,292,293,294,295,296,297,下面还有很多数字.......
..........
..........现在需要读取这个文件里的数字并存到数组里,文件开头的//号还有后面说明的文字要过滤掉,中间的空格也要过滤掉,还有逗号也不要,只要数字,应该怎么做??
然后再问个问题,怎么看我还剩多少分??!!

解决方案 »

  1.   

    论坛首页左侧->我的技术社区->我的社区积分
      

  2.   

    做法可以如下,具体的一些代码还需要你自己去写,查查资料。file * m_fp;
    char chTemp[100];memset( chTemp, '\0', sizeof(chTemp) );//clear chTempif( (m_pf = fopen( filename(包括路径和后缀名), "r" ) ) )//以读的形式打开文件
    {
        while( fgets( chTemp, 64, m_pf ) )//获取一行的字符并保存到chTemp里,
                                          //再执行一次就能获取下一行所有的字符
                                          //如果fgets()的结果是空的,则会跳出
        {
             //然后在这里面对chTemp进行处理,
             //逐个判断里面这些字符是否是数字或逗号(可以利用AscII码值进行判断),
             //如果是数字则保存起来。         memset( chTemp, '\0', sizeof(chTemp) );//clear chTemp      
         }
    }
      

  3.   

    添加类变量int *m_aNumber, m_iCount, m_iMaxCount;
    添加一动态申请内容方法
    void CXXX::ProcessMemory(int iSize)
    { if(m_aNumber == NULL)
    {
    m_aNumber = new int[iSize];
    m_iMaxCount = iSize;
    }
    else
    {
    int *lpTmp = new int[m_iMaxCount + iSize];
    memcpy(lpTmp, m_aNumber, m_iMaxCount*sizeof(int));
    delete []m_aNumber;
    m_aNumber = lpTmp;
    m_iMaxCount = m_iMaxCount + iSize;
    }
    }
    在调用如下代码即可: m_aNumber = NULL;
    m_iCount = 0;
    m_iMaxCount = 0;
    CString strRet = "";
    CStdioFile pFile("C:\\test.txt", CFile::modeRead);
    BOOL bContinue = TRUE;
    while(bContinue)
    {
    CString strContent = "";
    bContinue = pFile.ReadString(strContent);
    char *lpStr = strContent.GetBuffer(0);
    while(*lpStr != NULL)
    {
    int iTemp = 0;

    if( (*lpStr >= '0') && (*lpStr <='9' ) )
    {
    sscanf(lpStr, "%d", &iTemp);
    if(m_iCount + 1 >= m_iMaxCount)
    ProcessMemory(10);
    m_aNumber[m_iCount] = iTemp;
    //TRACE("%d, ", m_aNumber[m_iCount]);
    m_iCount++;
    } CString strTmp = "";
    strTmp.Format("%d", iTemp);
    int iLen = strTmp.GetLength();
    lpStr += iLen;
    }
    }
    for(int ii = 0; ii < m_iCount; ii++)
    TRACE("%d,", m_aNumber[ii]);所有的数据保存在m_aNumber里
    最后记录delete []m_aNumber;
      

  4.   

    因你的数据行每行数据数不同,无法用结构体指针来得到用下面的类吧
    按行从文件中读出文本,然后用下面的类分解(注意初始化时设置,为分隔符)/////////////////////////////////////////////////////////////////////////////
    /**
    * 文件名  :SplitStr.h
    * 版本号  : V1.0
    * 项目名称: 
    * 版权声明: Copyright 2005 Luowei. All Rights Reserved.
    * 模块简单描述:分解字符串
    *======================================================
    * 版本变更记录:
    *      
    *      2005-3-15  v1.0 罗伟
    */
    /////////////////////////////////////////////////////////////////////////////#ifndef _SPLITSTR_H
    #define _SPLITSTR_H#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000#include "UniString.h"
    const int MAX_SPLITNUM = 100;   //最大可分解的子字符串数量class CSplitStr
    {
      
    public:
      CSplitStr();
      CSplitStr( const LPWSTR Value );
      CSplitStr( const LPCSTR Value );
      CSplitStr( const CUniString & Value );
      ~CSplitStr(); //函数
     void SetSeparator(LPCTSTR sValue);
     void SetString(LPCTSTR sValue, LPCTSTR splitstr="|");  void   Split();
     int   GetStrLen();
     int   GetSplitStrLen(int index);
     int   GetSplitCount();
     long  GetSplitStr(int index, LPTSTR & splitStr,long bufLen = 2056);
     CString  GetSplitStr(int index);
     bool  GetSplitInt(int index, int &splitInt, long bufLen = 2056);
     INT   GetSplitInt(int index);
     bool  GetSplitLong(int index, long &splitLong, long bufLen = 2056);
     LONG  GetSplitLong(int index);
     bool  GetSplitDouble(int index, double &splitDouble, long bufLen = 2056);
     DOUBLE GetSplitDouble(int index);protected:
       CUniString m_str;   //传入类中的要进行分解的字符串
       CUniString m_Separator;  //分隔符
       void Init();private:
       int m_strCount;  //分解的字符串的总数   typedef struct TABSPLITSTR
      {
     int index;               //(0到MAX_SPLITNUM)= 顺序号  
     CUniString SplitString;  //字符串的内容
     LPCTSTR    bufStr;       //同SplitString内容,不过为缓冲区中的非Uni类型
      }; TABSPLITSTR m_tagSplitStr[MAX_SPLITNUM];};#endif
      

  5.   

    /////////////////////////////////////////////////////////////////////////////
    /**
    * 文件名  :SplitStr.cpp
    * 版本号  : V1.0
    * 项目名称: 
    * 版权声明: Copyright 2005 Luowei. All Rights Reserved.
    * 模块简单描述:分解字符串
    *======================================================
    * 版本变更记录:
    *      
    *      2005-3-15  v1.0 罗伟
    */
    /////////////////////////////////////////////////////////////////////////////
    #include "stdafx.h"
    #include "../include/SplitStr.h"
    CSplitStr::CSplitStr()
    {
    Init();
    }CSplitStr::CSplitStr( const LPWSTR Value )
    {
       Init();
       m_str = CUniString(Value);
    }
    CSplitStr::CSplitStr( const LPCSTR Value )

    Init(); 
        m_str = CUniString(Value);
    }CSplitStr::CSplitStr( const CUniString & Value)
    {   
    Init();  
    m_str = CUniString(Value);
    }
    CSplitStr::~CSplitStr()
    {}
    void CSplitStr::Init()
    {
    m_str = "";
        m_Separator = CUniString("|"); 
    m_strCount = 0;
    for(int i = 0; i < MAX_SPLITNUM; i++)
    {
           m_tagSplitStr[i].index = i;
           m_tagSplitStr[i].SplitString = "";
    }
    }
    ///////////////////////////////////////////////////////////
    //设置分隔符
    void CSplitStr::SetSeparator(LPCTSTR sValue)
    {
      if(strlen(sValue) > 0)
      m_Separator = sValue;
    }//设置字符串内容
    void CSplitStr::SetString(LPCTSTR sValue, LPCTSTR splitstr/*="|"*/)
    {
       Init();
       SetSeparator(splitstr);
       m_str = sValue;
    }//得到m_str字符串的长度
    int CSplitStr::GetStrLen()
    {
       return m_str.GetLength(); 
    }//得到指定分解项的字符串长度
    int CSplitStr::GetSplitStrLen(int index)
    {
       if(index>=0 && index < MAX_SPLITNUM)
       return m_tagSplitStr[index].SplitString.GetLength();
       else
       return 0;}
    //分隔字符串
    void CSplitStr::Split()
    {
       int firstPos = 0;
       int endPos = 0;
       int prePos = 0;
       int pos = -1;
       int slen = 0;
       int index = 0;   slen = GetStrLen();   //当前字符串内容为空
       if(slen <= 0)
       {
           m_strCount = 0;
       return;   }   //在非空字符串中无指定分隔符,将些字符串内容赋给数组0
       if(m_str.Find(0,slen -1,m_Separator) == -1)
       {
             m_tagSplitStr[0].index = 0;
     m_tagSplitStr[0].SplitString = m_str;
             m_strCount = 1;
       }   //有若开个分隔符
       else
       {
       m_strCount = 0;
       while(prePos < slen)
       {
      pos = m_str.Find(prePos,slen -1,m_Separator); 
      if(pos != -1)
      {
      firstPos = prePos;
      endPos = pos -1;
      m_tagSplitStr[index].index = index;
      m_tagSplitStr[index].SplitString = m_str.Mid(firstPos, endPos - firstPos+1); 
      m_strCount++;
      index++;
      prePos = pos + 1;
      }
      //在最后一个分隔符后应存在有内容或至少为一空内容
      else
      { 
      m_tagSplitStr[index].index = index;
      m_tagSplitStr[index].SplitString = m_str.Mid(endPos + 2, m_str.GetLength() - endPos);
      m_strCount++;
      break;
      }    }
       
       }}//得到分解后的总数
     int   CSplitStr::GetSplitCount()
     {
       return m_strCount;
     }//得到指定项的分解后的字符串内容,返回值为内存中所占用的缓冲区实际长度(汉字占用两个字节)
    long  CSplitStr::GetSplitStr(int index, LPTSTR & splitStr,long bufLen/* = 2056*/)
    {
       long sLen = 0;
       if(GetSplitCount() >0)
       {
            sLen = m_tagSplitStr[index].SplitString.GetBufferStr(splitStr,bufLen);
    // sLen = m_tagSplitStr[index].SplitString.GetLength(); 
       }   return sLen;}CString  CSplitStr::GetSplitStr(int index)
    {
       CString s = "";
       if(GetSplitCount() >0)
       {
            s = m_tagSplitStr[index].SplitString.m_pchDebugData;
       }   return s;
    }//得到指定项的分解后的字符串内容并转换为整数,无法转换时,返回FALSE
    bool  CSplitStr::GetSplitInt(int index, int &splitInt, long bufLen/* = 2056*/)
     {
        bool b = true;
        int  NoNull = 0;
        bool getNoNull = false;
    LPTSTR pStr = new CHAR[bufLen];    if(GetSplitStr(index, pStr,bufLen) > 0)
        {
    int count = strlen(pStr);
    for(int i = 0; i < count; i++)
    {
    if(*(pStr + i) != 32 && !getNoNull)  
    {
          NoNull = i;
      getNoNull = true;
    } //                数字1-9              
               if(isdigit(*(pStr + i)) == 0)
       {              //负号               
       if(*(pStr + NoNull) != 45)
       {
           b = false;
       break;
       }
       } }
    //全为数字
            if(b)
    {
               splitInt = atol(pStr);
    }
    }
        delete pStr;
    return b;
     }
      

  6.   

    //得到指定项的分解后的字符串内容并转换为整数
    INT  CSplitStr::GetSplitInt(int index)
     {
        bool b = true;
    LONG splitInt = 0;
        int  NoNull = 0;
         bool getNoNull = false;
    LPTSTR pStr = new CHAR[2056];    if(GetSplitStr(index, pStr,2056) > 0)
        {
    int count = strlen(pStr);
    for(int i = 0; i < count; i++)
    {
    if(*(pStr + i) != 32 && !getNoNull)  
    {
          NoNull = i;
      getNoNull = true;
    } //                数字1-9              
               if(isdigit(*(pStr + i)) == 0)
       {              //负号               
       if(*(pStr + NoNull) != 45)
       {
           b = false;
       break;
       }
       } }
    //全为数字
            if(b)
    {
               splitInt = atol(pStr);
    }
    }
        delete pStr;
    return  splitInt;
     }//得到指定项的分解后的字符串内容并转换为长整数无法转换时,返回FALSE
     bool  CSplitStr::GetSplitLong(int index, long &splitLong, long bufLen/* = 2056*/)
     {
        bool b = true;
        int  NoNull = 0;
         bool getNoNull = false;
    LPTSTR pStr = new CHAR[bufLen];    if(GetSplitStr(index, pStr,bufLen) > 0)
        {
    int count = strlen(pStr);
    for(int i = 0; i < count; i++)
    {
    if(*(pStr + i) != 32 && !getNoNull)  
    {
          NoNull = i;
      getNoNull = true;
    } //                数字1-9              
               if(isdigit(*(pStr + i)) == 0)
       {              //负号               
       if(*(pStr + NoNull) != 45)
       {
           b = false;
       break;
       }
       } }
    //全为数字
            if(b)
    {
               splitLong = atol(pStr);
    }
    }
        delete pStr;
    return b;
     }//得到指定项的分解后的字符串内容并转换为长整数无法转换时,返回FALSE
    LONG  CSplitStr::GetSplitLong(int index)
     {
        bool b = true;
    LONG splitLong = 0;
        int  NoNull = 0;
         bool getNoNull = false;
    LPTSTR pStr = new CHAR[2056];    if(GetSplitStr(index, pStr,2056) > 0)
        {
    int count = strlen(pStr);
    for(int i = 0; i < count; i++)
    {
    if(*(pStr + i) != 32 && !getNoNull)  
    {
          NoNull = i;
      getNoNull = true;
    } //                数字1-9              
               if(isdigit(*(pStr + i)) == 0)
       {              //负号               
       if(*(pStr + NoNull) != 45)
       {
           b = false;
       break;
       }
       } }
    //全为数字
            if(b)
    {
               splitLong = atol(pStr);
    }
    }
        delete pStr;
    return  splitLong;
     } 
     //得到指定项的分解后的字符串内容并转换为浮点数 无法转换时,返回FALSE
     bool  CSplitStr::GetSplitDouble(int index, double &splitDouble, long bufLen/* = 2056*/)
     {     bool b = true;
     int  NoNull = 0;
     bool getNoNull = false;
    LPTSTR pStr = new CHAR[bufLen];    if(GetSplitStr(index, pStr,bufLen) > 0)
        {
    int count = strlen(pStr);
    for(int i = 0; i < count; i++)
    {
    if(*(pStr + i) != 32 && !getNoNull)  
    {
          NoNull = i;
      getNoNull = true;
    } //                数字1-9              
               if(isdigit(*(pStr + i)) == 0)
       {              //负号               点号
       if(*(pStr + NoNull) != 45  && *(pStr + i) != 46 )
       {
           b = false;
       break;
       }
       } }
    //全为数字
            if(b)
    {
               splitDouble = atof(pStr);
    }
    }
        delete pStr;
        return b; } 
     //得到指定项的分解后的字符串内容并转换为浮点数 无法转换时,返回FALSE
    DOUBLE  CSplitStr::GetSplitDouble(int index)
     {
         bool b = true;
     int  NoNull = 0;
     bool getNoNull = false;
     DOUBLE splitDouble = 0;
    LPTSTR pStr = new CHAR[2056];    if(GetSplitStr(index, pStr,2056) > 0)
        {
    int count = strlen(pStr);
    for(int i = 0; i < count; i++)
    {
    if(*(pStr + i) != 32 && !getNoNull)  
    {
          NoNull = i;
      getNoNull = true;
    } //                数字1-9              
               if(isdigit(*(pStr + i)) == 0)
       {              //负号               点号
       if(*(pStr + NoNull) != 45  && *(pStr + i) != 46 )
       {
           b = false;
       break;
       }
       } }
    //全为数字
            if(b)
    {
               splitDouble = atof(pStr);
    }
    }
        delete pStr;
    return  splitDouble;
     }//////////////