Разделение слова из прочитанного файла - PullRequest
0 голосов
/ 02 сентября 2010

Я пытаюсь прочитать содержимое текстового файла в атрибуты класса. Файл структурирован таким образом, что каждая строка содержит всю информацию, необходимую для одного объекта класса. Одна строка может выглядеть так:

TYC 9537 00066 1 341.76920751 -88.32499920  8.762  9.294 mc1 hd 210531        0.385   8.80 P F5 5  6440  F5 V

Что я делал, так это читал строку из файла в поток с getline() в такой функции:

void LoadFile( std::vector<TycDat*> & target , std::fstream & source )
{
    std::string line ;
    while( std::getline( source , line ) )
    {
        target.push_back( new TycDat ( line ) ) ;
    }
}

Где TycDat - это имя класса, target - это вектор, в котором я его храню, а source - это поток файла, уже указанный в файле.

В конструкторе для TycDat я создал std::istringstream, связанный с std::string параметром line, и использовал оператор >> для считывания значений по порядку в атрибуты. Это работало по большей части. Мне пришлось создать несколько массивов char, чтобы можно было прочитать некоторые из них, где, например, hd 210531 соответствует одному string, который оператор >> разделил бы.

Моя настоящая проблема возникла с одной из последних частей, в примере 8.80 P F5 5 6440. Там, где написано F5, на самом деле два значения, буква и число, которые мне нужно хранить отдельно как char и int. Более того, int в конце не всегда может быть там.

Что я делаю сейчас, после того, как правильно прочитал P:

std::string aux_ ;
iss >> aux_ ;
TClass = aux_[0] ;    //     Temperature class (7)
if ( aux_.size() > 1 ) SClass = std::atoi( aux_.data()+1 ) ;  // SubClass

Мне это не нравится, в основном потому, что я делаю новый string. Но я не мог понять, как заставить его работать правильно. Проблема в том, чтобы разделить слово на части (я думаю, я мог бы ignore один символ и затем использовать TClass = iss.get(), чтобы получить TClass, но я не знаю, как проверить, существует ли следующее значение, прежде чем читать его.

Хм, я мог бы peek найти значение, отличное от ' ', затем использовать оператор >> ....

Ну, я попробую это, я думаю, и дам вам знать, как это происходит. Спасибо за помощь. Любые другие комментарии приветствуются. Мне плохо из-за стирания вопроса после написания всего этого.

1 Ответ

0 голосов
/ 02 сентября 2010

Я бы посоветовал взглянуть на Boost.Spirit.Это позволит вам выразить формат входной строки естественным образом и облегчит будущие изменения, если (когда!) Изменится формат ввода.В качестве бонуса, он будет работать намного быстрее во время выполнения!http://www.boost.org/doc/libs/1_44_0/libs/spirit/doc/html/spirit/introduction.html Удачи

...