本帖最后由 xzjjy 于 2012-02-16 14:50:55 编辑

解决方案 »

  1.   

    贴个完成的代码看看ReadString可以带上长度的。试试。
      

  2.   

    不清楚你说的,你把“SUB 替补“这个在你的txt中删掉,看它能不能全部读出来,最好贴个代码看下,ReadString有两种方式,你用的哪种virtual LPTSTR ReadString(
       LPTSTR lpsz,
       UINT nMax 
    );
    virtual BOOL ReadString(
       CString& rString
    );
      

  3.   

    楼主是不是需要逐行读数据?下面你可以参考下:////////////////////////////////////////////////
    //.h File
    class   CTextFile   :   public   CStdioFile    
    {
    int   m_iLineCount;
    CStringArray   m_arrLines;
    int   m_iErrCode;
    CString   m_strErrString;
    int   m_nOpenFlags;
    public:
    int   GetErrCode();
    CString   GetErrString();
    BOOL   WriteLine(CString   line);
    CTextFile(LPCTSTR   lpszFileName,   UINT   nOpenFlags   );
    virtual   ~CTextFile();int   GetLineCount();
    CString   ReadLine(int   lineIndex)   const;
    CString   ReadField(int   lineIndex,   int   fieldIndex,   CString   splitChar)   const;
    CString   operator   [](   int   nIndex   )   const;
    };/////////////////////////////////////////////////////////////////
    //   CPP   File
    //////////////////////////////////////////////////////////////////////CTextFile::CTextFile(LPCTSTR   lpszFileName,   UINT   nOpenFlags   )
    :   CStdioFile(lpszFileName,   nOpenFlags)
    {
    m_iLineCount   =   0;
    m_nOpenFlags   =   nOpenFlags;
    m_iErrCode   =   0;
    m_strErrString   =   _T( " ");
    while(true)
    {
    if   (   ((m_nOpenFlags   &   CFile::modeRead)   ==   CFile::modeRead)
    &&   (m_nOpenFlags   !=   CFile::modeWrite)   )
    {
    int   fileLen   =   GetLength();
    if   (fileLen   ==   0)
    break;
    char   *line   =   new   char[fileLen+1];
    memset(line,   0x00,   sizeof(line));
    if   (!ReadString(line,   fileLen))   //   feof
    {
    delete   line;
    break;
    }
    CString   str(line);
    str   =   str.Mid(0,   str.GetLength()-1);
    str.TrimRight();
    if   (str   !=   " ")
    {
    m_iLineCount   ++;
    m_arrLines.Add(str);
    }
    delete   line;
    }
    else
    break;
    }
    }CTextFile::~CTextFile()
    {
    Flush();
    if   (m_arrLines.GetSize()   >   0)
    m_arrLines.RemoveAll();
    //if   (this-> m_hFile)
    // this-> Close();
    }int   CTextFile::GetLineCount()
    {
    return   m_iLineCount;
    }//   line   index   start   from   0
    CString   CTextFile::ReadLine(int   lineIndex)   const
    {
    if   (lineIndex   > =   m_arrLines.GetSize())
    return   " ";
    else
    return   m_arrLines[lineIndex];
    }//   lineIndex   &   fieldIndex   start   from   0
    CString   CTextFile::ReadField(int   lineIndex,   int   fieldIndex,   CString   splitChar)   const
    {
    CString   strLine   =   ReadLine(lineIndex);
    CSuperString   spStrLine(strLine);
    int   num;
    CString   *   strArr   =   spStrLine.Split(splitChar,   num);
    if   (fieldIndex   >   num)
    return   " ";
    else
    return   strArr[fieldIndex];
    }CString   CTextFile::operator   [](   int   lineIndex   )   const
    {
    return   ReadLine(lineIndex);
    }BOOL   CTextFile::WriteLine(CString   line)
    {
    int   err   =   0;
    if   (!m_pStream)
    return   FALSE;
    if   (   (m_nOpenFlags   &   CFile::modeWrite)   !=   CFile::modeWrite   )
    {
    m_iErrCode   =   ACCESS_DENIED;
    m_strErrString   =   "Access   denied! ";
    return   FALSE;
    }
    SeekToEnd();
    try
    {
    WriteString(line   +   "\r\n ");
    }
    catch(CFileException   e)
    {
    err   =   1;
    }
    if   (err)
    return   FALSE;
    return   TRUE;
    }CString   CTextFile::GetErrString()
    {
    return   m_strErrString;
    }int   CTextFile::GetErrCode()
    {
    return   m_iErrCode;
      

  4.   

    1A=ctrl Z 即文件结束,必须删除它!
    写文件时不应该写这个1A。
    这是dos下输入文件的办法如:
    C:\type con: xxx.txt
    abcd
    efg
    Ctrl Z // 这样xxx.txt有:abcd和efg但没有ctrl Z 1Ah