Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Чтение данных(строки, числа) из текстового файла


Автор: abs32 9.2.2011, 19:59
Здравствуйте. 

Пишу программу, составляющую кроссворды. Нужно прочитать готовый кроссворд из файла.  
Данные в файле хранятся в следующем формате:

int,int,count
"word","clue",char,int,int

Как можно разобрать по переменным вторую строчку ?
То что написано в кавычках нужно считать в string. 

Я разбираю строчку посимвольно и от этого код получился слишком объёмным.
Как можно написать то же самое, но чтобы код был менее объёмным и более читаемым ?

Код

bool Grid::ReadFormFile(string filename)
{
    if(filename.empty()) return false;

    ifstream f(filename.c_str());
    if(f.bad()) return false;

    string _t;

        grid.clear();
        count=0;

        string _w,_c;
        int _x,_y,_dir;
        
        // формат записи:
        // int,int,count
        // "word","clue",char,int,int

        // чтение размера поля и количество слов в кроссорде
        try
        {
        std::getline(f,_t,',');
                SizeX = StrToInt(_t.c_str());
        std::getline(f,_t,',');
                SizeY = StrToInt(_t.c_str());
        std::getline(f,_t,'\n');
                count = StrToInt(_t.c_str());
        }
        catch(EConvertError &e)
        {
                f.close();
                return false;
        }

        // читаем слова 
        int i = count;
        char ch;
        while(!f.eof() && i>0)
        {
                
                // пропускаем пробелы и ковычки
                _w = ""; ch = ' ';
                while(!f.eof() && ch!='\"')
                {
                        if(ch!=' ') 
                        {
                                f.close();
                                return false;
                        }
                        f >> ch;
                }
                // читаем слово
                ch = ' ';
                while(!f.eof() && ch!='\"')
                {
                        f >> ch;
                        if(ch!='\"') _w += ch;
                }

                if(ch!='\"') 
                {
                        f.close();
                        return false;
                }
                trimm(_w,' ');

                // пропускаем ковычки, пробелы, запятые
                _c = ""; ch = ' ';
                while(!f.eof() && ch!='\"')
                {
                        if(ch!=' ' && ch!='\"' && ch!=',' ) 
                        {
                                f.close();
                                return false;
                        }
                        f >> ch;
                }
                // читаем описание слова
                ch = ' ';
                while(!f.eof() && ch!='\"')
                {
                        f >> ch;
                        if(ch!='\"') _c += ch;
                }
                trimm(_c,' ');

                if(ch!='\"') 
                {
                        f.close();
                        return false;
                }
                // пропускаем все символы до запятой
                ch = ' ';
                while(!f.eof() && ch!=',')
                {
                        if(ch!=' ' && ch!=','  ) 
                        {
                                f.close();
                                return false;
                        }
                        f >> ch;
                }
                
                std::getline(f,_t,',');
                        if(_t=="H" || _t=="h") {_dir = H;}
                        else 
                        if(_t=="V" || _t=="v") {_dir = V;}
                        else 
                        {
                                f.close();
                                return false;
                        }
                try
                {
                std::getline(f,_t,',');
                        _x = StrToInt(_t.c_str()); 
                std::getline(f,_t,'\n');
                        _y = StrToInt(_t.c_str());
                }
                catch(EConvertError &e)
                {
                        f.close();
                        return false;
                }
          grid.push_back(GridElement(_w,_c,_dir,_x,_y));               
                
                i--;
        }
  
        f.close();

        if(i>0) return false;
        
        return true;        
}



Пример файла с данными:
Код

14,14,6
"рот","",V,3,2
"рыба","Описание",H,3,2
"утварь","Описание, с запятой",H,2,4
"ужин","",V,2,4
"аромат","",V,5,4
"обед","",H,5,6





Автор: abs32 9.2.2011, 20:58
Нашел решение:

Код

bool Grid::ReadFormFile(string filename)
{
    if(filename.empty()) return false;

    ifstream f(filename.c_str());
    if(f.bad()) return false;

    string _t;

        grid.clear();
        count=0;

        string _w,_c;
        int _x,_y,_dir;
        
        // формат записи:
        // int,int,count
        // "word","clue",char,int,int

        // чтение размера поля и количество слов в кроссорде
        try
        {
                std::getline(f,_t,',');
                        SizeX = StrToInt(_t.c_str());
                std::getline(f,_t,',');
                        SizeY = StrToInt(_t.c_str());
                std::getline(f,_t,'\n');
                        count = StrToInt(_t.c_str());
        }
        catch(EConvertError &e)
        {
                f.close();
                return false;
        }

        // читаем слова 
        int i = count;
        while(!f.eof() && i>0)
        {
                std::getline(f,_t,'\"');
                std::getline(f,_w,'\"');
                
                std::getline(f,_t,'\"');
                std::getline(f,_c,'\"');

                std::getline(f,_t,',');
                
                std::getline(f,_t,',');
                        if(_t=="H" || _t=="h") {_dir = H;}
                        else 
                        if(_t=="V" || _t=="v") {_dir = V;}
                        else 
                        {
                                f.close();
                                return false;
                        }
                try
                {
                        std::getline(f,_t,',');
                                _x = StrToInt(_t.c_str()); 
                        std::getline(f,_t,'\n');
                                _y = StrToInt(_t.c_str());
                }
                catch(EConvertError &e)
                {
                        f.close();
                        return false;
                }
          grid.push_back(GridElement(_w,_c,_dir,_x,_y));               
                
                i--;
        }
  
        f.close();

        if(i>0) return false;
        
        return true;        
}



Кстати, есть какие-нибудь замечания по коду ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)