Я пытаюсь прочитать содержимое текстового файла в атрибуты класса. Файл структурирован таким образом, что каждая строка содержит всю информацию, необходимую для одного объекта класса. Одна строка может выглядеть так:
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
найти значение, отличное от ' '
, затем использовать оператор >>
....
Ну, я попробую это, я думаю, и дам вам знать, как это происходит. Спасибо за помощь. Любые другие комментарии приветствуются. Мне плохо из-за стирания вопроса после написания всего этого.