
Опытный
 
Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев
Репутация: нет Всего: 23
|
1. > Полностью загрузить файл в память и оттуда его анализировать > (если да то для хранения использовать объект класса string? - > если да то какой объем он сможет хранить, если не так, то как ) думаю, загрузить гиговый файл не проблемно или даже больше - ведь допустимый размер, кажись, определяется доступной памятью процесса, а это кажись около 4 гигов на 32-разрядном проце 2. Если файлы не большие, можете попробовать использовать регулярки (у меня так пыхники знакомые не большие файлы парсят) 3. Посмотрите исходные коды готовых и отлаженных решений и выберите свою золотую середину. А вообще, выбор того или иного способа зависит от задачи: мне в своё время нужен был парсер для небольших файлов (я ими с web-сервером общался) и я для решения этой проблемы написал простой до крика парсер (код парсера прилагаю): | Код | // header //---------------------------------------------------------------------------
#ifndef PosterDataParserH #define PosterDataParserH
class TDataParser { private: char *buffer; public: int getStartTagOffset(char *name); int getStopTagOffset(char *name); int CreateNode(char *owner, char *name); int CreateNode(char *owner, char *name, char *value); int CreateNode(char *owner, char *name, int value); int getValue(char *name, char *value, int size); char *getBuffer(); TDataParser(); TDataParser(char *data); ~TDataParser(); };
//--------------------------------------------------------------------------- #endif
// cpp //---------------------------------------------------------------------------
#pragma hdrstop #include <string.h> #include <stdio.h>
#include "PosterDataParser.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//--------------------------------------------------------------------------- TDataParser::TDataParser() { char *Header = "<Data></Data>"; buffer = new char[strlen(Header) + 1]; strcpy(buffer, Header); }
//--------------------------------------------------------------------------- TDataParser::TDataParser(char *data) { buffer = new char[strlen(data) + 1]; strcpy(buffer, data); }
//--------------------------------------------------------------------------- int TDataParser::getStartTagOffset(char *name) { char *str = new char [strlen(name) + 10]; strcpy(str, "<"); strcat(str, name); strcat(str, ">"); int str_len = strlen (str); char * substr = strstr(buffer, str); delete str; if(!substr) return -1; return (strlen(buffer) - strlen(substr) + str_len); }
//--------------------------------------------------------------------------- int TDataParser::getStopTagOffset(char *name) { char *str = new char [strlen(name) + 10]; strcpy(str, "</"); strcat(str, name); strcat(str, ">"); char * substr = strstr(buffer, str); delete str; if(!substr) return -1; return (strlen(buffer) - strlen(substr)); }
//--------------------------------------------------------------------------- int TDataParser::CreateNode(char *owner, char *name) { int start = getStartTagOffset(owner); int stop = getStopTagOffset(owner);
if((start < 0) || (stop < 0)) return -1; int BufferSize = strlen(buffer) + strlen(name) * 2 + 0xFF; char * new_buffer = new char[BufferSize]; memset(new_buffer, 0x00, BufferSize); strncpy(new_buffer, buffer, start); strcat(new_buffer, "<"); strcat(new_buffer, name); strcat(new_buffer, ">"); strcat(new_buffer, "</"); strcat(new_buffer, name); strcat(new_buffer, ">"); strcat(new_buffer, buffer + start); delete [] buffer; buffer = new_buffer; return 1; }
//--------------------------------------------------------------------------- int TDataParser::CreateNode(char *owner, char *name, char * value) { int start = getStartTagOffset(owner); int stop = getStopTagOffset(owner);
if((start < 0) || (stop < 0)) return -1; int BufferSize = strlen(buffer) + strlen(name) * 2 + strlen(value) + 0xFF; char * new_buffer = new char[BufferSize]; memset(new_buffer, 0x00, BufferSize); strncpy(new_buffer, buffer, start); strcat(new_buffer, "<"); strcat(new_buffer, name); strcat(new_buffer, ">"); strcat(new_buffer, value); strcat(new_buffer, "</"); strcat(new_buffer, name); strcat(new_buffer, ">"); strcat(new_buffer, buffer + start); delete [] buffer; buffer = new_buffer; return 1; }
//--------------------------------------------------------------------------- int TDataParser::CreateNode(char *owner, char *name, int value) { int start = getStartTagOffset(owner); int stop = getStopTagOffset(owner);
if((start < 0) || (stop < 0)) return -1; char str[0xFF]; sprintf(str, "%d", value); int BufferSize = strlen(buffer) + strlen(name) * 2 + strlen(str) + 0xFF; char * new_buffer = new char[BufferSize]; memset(new_buffer, 0x00, BufferSize); strncpy(new_buffer, buffer, start); strcat(new_buffer, "<"); strcat(new_buffer, name); strcat(new_buffer, ">"); strcat(new_buffer, str); strcat(new_buffer, "</"); strcat(new_buffer, name); strcat(new_buffer, ">"); strcat(new_buffer, buffer + start); delete [] buffer; buffer = new_buffer; return 1; }
//--------------------------------------------------------------------------- int TDataParser::getValue(char *name, char *value, int size) { int start = getStartTagOffset(name); int stop = getStopTagOffset(name);
if((start < 0) || (stop < 0)) return -1; if(size < (stop - start) + 1) return -1; memset(value, 0x00, (stop - start) + 1); strncpy(value, buffer + start, stop - start); return 1; }
//--------------------------------------------------------------------------- char *TDataParser::getBuffer() { return buffer; }
//--------------------------------------------------------------------------- TDataParser::~TDataParser() { delete buffer; }
|
--------------------
Имеющий язык - да не убоится спросить! 
|