2008-11-19 3 views
0

Мне нужно использовать C++ для чтения в тексте с пробелами, за которым следует числовое значение.Чтение файла смешанных данных в строку C++

Например, данные, выглядит следующим образом:

text1 
1.0 
text two 
2.1 
text2 again 
3.1 

не может быть прочитан с 2 "infile >>" заявления. Мне не повезло с getline . В конечном итоге я хочу заполнить struct этими двумя элементами данных. Есть идеи?

ответ

1

Стандартная библиотека IO не собирается делать это для вас в одиночку, вам нужно провести простой анализ данных, чтобы определить, где заканчивается текст и начинается числовое значение. Если вы можете сделать некоторые упрощающие предположения (например, говоря, что есть ровно одна строка текста/числа на строку и минимальное восстановление ошибок), было бы не так уж плохо, чтобы getline() все это в строку, а затем сканирование вручную. В противном случае вам, вероятно, лучше использовать регулярное выражение или библиотеку синтаксического анализа, чтобы справиться с этим, а не изобретать колесо.

0

Если вы можете быть уверены, что ваш вход хорошо сформирован, вы можете попробовать что-то вроде этого образца:

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::istringstream iss("text1 1.0 text two 2.1 text2 again 3.1"); 

    for (;;) 
    { 
     double x; 
     if (iss >> x) 
     { 
      std::cout << x << std::endl; 
     } 
     else 
     { 
      iss.clear(); 
      std::string junk; 
      if (!(iss >> junk)) 
       break; 
     } 
    } 
} 

Если вы должны подтвердить ввод (вместо того, чтобы просто пытаться разобрать что-нибудь, похожий на дважды от него), вам придется написать какой-то парсер, который не является жестким, но скучным.

+0

Возможно, я не помню семантику оператора std :: string >> правильно, но разве это не удается собрать какие-либо пробелы в текстовом поле? – 2008-11-19 18:30:26

1

Почему? Вы можете использовать getline, предоставляя пространство как разделитель строк. Затем вышивайте детали, если следующий номер.

0

Pseudocode.

Это должно сработать. Однако предполагается, что у вас есть текст/числа в парах. Вам нужно будет сделать несколько попыток, чтобы получить все набравшие счастье.

while(! eof) 
    getline(textbuffer) 
    getline(numberbuffer) 
    stringlist = tokenize(textbuffer) 
    number = atof(numberbuffer) 
Смежные вопросы