真爱

工作后就没写过C风格的代码了,刚用C风格写了些文件处理的笔试题,发现原来我的真爱还是C而不是C++。其实切换到C姿态写代码处理char,char*还是很好控制的,只是写C++的时候不想去考虑这些事情,感觉太繁琐细微的不应该是C++处理的。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#include <list>
#include <map>

using namespace std;

#define filepath "q1_test.txt"

class fileReader
{
public:
    bool loadFile(const char* filename)
    {
        if (strlen(filename) <= 0)
        {
            return false;
        }

        FILE* file = NULL;
        fopen_s(&file, filename, "rb");
        if (!file)
        {
            return false;
        }

        fseek (file , 0 , SEEK_END);
        len = ftell (file);
        rewind (file);

        if (len < 0)
        {
            return false;
        }

        //_buffer = (char*)malloc(sizeof(char) * lsize);
        _buffer = new char[len];
        if (!_buffer)
        {
            return false;
        }

        int result = fread(_buffer, 1, len, file);
        if (result != len)
        {
            return false;
        }

        fclose(file);

        return true;
    }

public:
    char* _buffer;
    int len;
};

//////////////////////////////////////////////////////////////////////////

class parser
{
public:
    bool isNumber(char* c)
    {
        if ((*c) >= '0' && (*c) <= '9')
        {
            return true;
        }

        return false;
    }

    bool isLetter(char* c)
    {
        if (((*c) >= 'a' && (*c) <= 'z') ||
            ((*c) >= 'A' && (*c) <= 'Z'))
        {
            return true;
        }

        return false;
    }

    bool isSpace(char* c)
    {
        if ((*c) == ' ')
        {
            return true;
        }

        return false;
    }

    int getVowelNumInAToken(char* str)
    {
        if (!str || strlen(str) <= 0)
        {
            return 0;
        }


    }

    bool initWithBuffer(char* buffer, int length)
    {
        if (!buffer)
        {
            return false;
        }

        char* pt = buffer;
        char* header = buffer;
        int len = 0;

        bool start = true;

        for (int i = 0;i < length ; ++i, ++pt)
        {
            //pass by the symbol at front of a token
            if ((*header) == ' ' && !isNumber(pt) && !isLetter(pt) && !isSpace(pt))
            {
                continue;
            }
            else if (!isSpace(pt))
            {
                ++len;
                if ((*header) == ' ')    //used for reset the head of a token
                {
                    header = pt;
                    len = 1;
                }
            }
            else
            {
                if ((*header) == ' ')
                {
                    continue;
                }

                //if is a symbol it should not be contained in a token
                if (!isLetter(header + len - 1) && !isNumber(header + len - 1))
                {
                    --len;
                }

                char* str = new char[len + 1];
                if (!str)
                {
                    return false;
                }
                memcpy(str, header, len);
                (str)[len] = '\0';
                _tokenList.push_back(str);
                header = pt;

                ++_tokenNum;
            }
        }

        return true;
    }

public:
    list<char*> _tokenList;
    int _tokenNum;
};

void main()
{
    fileReader f;
    if (!f.loadFile(filepath))
    {
        return;
    }

    parser p;
    if (!p.initWithBuffer(f._buffer, f.len))
    {
        return;
    }

    system("pause");
}

 

posted on 2013-11-19 00:59  shizuka  阅读(184)  评论(0编辑  收藏  举报

导航