file_parser.cpp

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 158 行

CPP
158
字号
// $Id: File_Parser.cpp 78543 2007-06-03 20:08:20Z olli $#ifndef FILE_PARSER_C#define FILE_PARSER_C#include "ace/OS_NS_stdio.h"#include "ace/OS_NS_stdlib.h"#include "File_Parser.h"// This fixes a nasty bug with cfront-based compilers (like// Centerline).typedef FPRT::Return_Type FP_RETURN_TYPE;// File_Parser stuff.template <class ENTRY>File_Parser<ENTRY>::~File_Parser (void){}template <class ENTRY> intFile_Parser<ENTRY>::open (const ACE_TCHAR filename[]){  this->infile_ = ACE_OS::fopen (filename, ACE_TEXT ("r"));  if (this->infile_ == 0)    return -1;  else    return 0;}template <class ENTRY> intFile_Parser<ENTRY>::close (void){  return ACE_OS::fclose (this->infile_);}template <class ENTRY> FP_RETURN_TYPEFile_Parser<ENTRY>::getword (char buf[]){  return this->readword (buf);}// Get the next string from the file via this->readword()// Check make sure the string forms a valid number.template <class ENTRY> FP_RETURN_TYPEFile_Parser<ENTRY>::getint (ACE_INT32 &value){  char buf[BUFSIZ];  FP_RETURN_TYPE read_result = this->readword (buf);  if (read_result == FPRT::RT_SUCCESS)    {      // Check to see if this is the "use the default value" symbol?      if (buf[0] == '*')        return FPRT::RT_DEFAULT;      else        {          // ptr is used for error checking with ACE_OS::strtol.          char *ptr = 0;          // try to convert the buf to a decimal number          value = ACE_OS::strtol (buf, &ptr, 10);          // check if the buf is a decimal or not          if (value == 0 && ptr == buf)            return FPRT::RT_PARSE_ERROR;          else            return FPRT::RT_SUCCESS;        }    }  else    return read_result;}template <class ENTRY> FP_RETURN_TYPEFile_Parser<ENTRY>::readword (char buf[]){  int wordlength = 0;  int c;  // Skip over leading delimiters and get word.  while ((c = ACE_OS::getc (this->infile_)) != EOF && c != '\n')    if (this->delimiter (c))      {        // We've reached the end of a "word".        if (wordlength > 0)          break;      }    else      buf[wordlength++] = c;  buf[wordlength] = '\0';  if (c == EOF) {    // If EOF is just a delimiter, don't return EOF so that the word    // gets processed.    if (wordlength > 0)      {        ACE_OS::ungetc (c, this->infile_);        return FPRT::RT_SUCCESS;      }    else      // else return EOF so that read loops stop      return FPRT::RT_EOFILE;  }  else if (c == '\n')    {      // if the EOLINE is just a delimiter, don't return EOLINE      // so that the word gets processed      if (wordlength > 0)        ACE_OS::ungetc (c, this->infile_);      else        return FPRT::RT_EOLINE;    }  // Skip comments.  if (this->comments (buf[0]))    {      if (this->skipline () == EOF)        return FPRT::RT_EOFILE;      else        return FPRT::RT_COMMENT;    }  else    return FPRT::RT_SUCCESS;}template <class ENTRY> intFile_Parser<ENTRY>::delimiter (char ch){  return ch == ' ' || ch == ',' || ch == '\t';}template <class ENTRY> intFile_Parser<ENTRY>::comments (char ch){  return ch == '#';}template <class ENTRY> intFile_Parser<ENTRY>::skipline (void){  // Skip the remainder of the line.  int c;  while ((c = ACE_OS::getc (this->infile_)) != '\n' && c != EOF)    continue;  return c;}#endif /* _FILE_PARSER_C */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?