chxavnextline.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:2k
源码类别:

Symbian

开发平台:

C/C++

  1. /*============================================================================*
  2.  *
  3.  * (c) 1995-2002 RealNetworks, Inc. Patents pending. All rights reserved.
  4.  *
  5.  *============================================================================*/
  6. #include "chxavbuffer.h" 
  7. #include "chxavnextline.h"
  8. static const int InitialLineBufSize = 320;
  9. CHXAvNextLine::CHXAvNextLine(const CHXString& name)
  10.      : m_name(name),
  11.        m_pFile(0),
  12.        m_buf(InitialLineBufSize),
  13.        m_lineNum(0)
  14. {
  15. }
  16. CHXAvNextLine::~CHXAvNextLine()
  17. {
  18.     Close();
  19. }
  20. bool CHXAvNextLine::Open()
  21. {
  22.     m_pFile = (m_name == "") ? stdin : fopen(m_name, "r");
  23.     return m_pFile != 0;
  24. }
  25. void CHXAvNextLine::Close()
  26. {
  27.     if (m_name != "" && m_pFile)
  28. fclose(m_pFile);
  29.     m_pFile = 0;
  30. }
  31. bool CHXAvNextLine::IsOpen() const
  32. {
  33.     return m_pFile != 0;
  34. }
  35. bool CHXAvNextLine::Reset()
  36. {
  37.     bool ret = m_pFile && fseek(m_pFile, (long) 0, SEEK_SET) != -1;
  38.     if (ret)
  39. m_lineNum = 0;
  40.     return ret;
  41. }
  42. bool CHXAvNextLine::GetLine(CHXString& line)
  43. {
  44.     int len = 0;
  45.     if (m_pFile)
  46.     {
  47. if (FGetS(m_buf, m_pFile))
  48. {
  49.     line = (char *)m_buf;
  50.     len = line.GetLength();
  51.     m_lineNum++;
  52. }
  53.     }
  54.     return len > 0;
  55. }
  56. bool CHXAvNextLine::End() const
  57. {
  58.     return m_pFile == 0 || feof(m_pFile);
  59. }
  60. // replacement for system fgets that
  61. // looks for r or rn in addtion to n
  62. char* CHXAvNextLine::FGetS(CHXAvBuffer& buf, FILE* fp)
  63. {
  64.     bool eol = false;
  65.     int i = 0;
  66.     for (i = 0; !eol; ++i)
  67.     {
  68. int c = fgetc(fp);
  69. if (c == EOF)
  70.     break;
  71. // Make sure the buffer is large enough
  72. buf.Resize(i + 2);
  73. ((char*)buf)[i] = c;
  74. if (c == 'n')
  75.     eol = true;
  76. else if (c == 'r')
  77. {
  78.     eol = true;
  79.     // check for n and eat it
  80.     if ((c = fgetc(fp)) == 'n')
  81. ((char*)buf)[++i] = c;
  82.     else if (c != EOF)
  83. ungetc(c, fp);
  84.     else
  85. break;
  86. }
  87.     }
  88.     if (buf.MaxLength() > 0)
  89. ((char*)buf)[i] = '';
  90.     return (i == 0 ? 0 : (char*)buf);
  91. }