Здравствуйте.
Пишу программу, составляющую кроссворды. Нужно прочитать готовый кроссворд из файла. Данные в файле хранятся в следующем формате:
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
|
|