Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение данных(строки, числа) из текстового файла 
V
    Опции темы
abs32
Дата 9.2.2011, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.9.2009

Репутация: нет
Всего: 1



Здравствуйте. 

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

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:20
PM MAIL   Вверх
abs32
Дата 9.2.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.9.2009

Репутация: нет
Всего: 1



Нашел решение:

Код

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;        
}



Кстати, есть какие-нибудь замечания по коду ?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1102 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.