真爱
工作后就没写过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"); }