2011-06-07 5 views
0

Я новичок в C++. Я хочу, чтобы прочитать данные из STL-файл, который выглядит какИгнорирование символов при чтении из текстового файла в C++

facet normal -0 -0 -1 

outer loop 

vertex 2.49979 1.14163 0.905974 

vertex 2.49979 1.01687 0.905974 

vertex 2.22582 1.68468 0.905974 

endloop 

endfacet 0 

и то же самое будет продолжаться с разными значениями для скажем, 100 раз.

Теперь я хочу читать и хранить только числовое значение в виде 2D-массива. Было бы еще лучше, если бы я мог полностью игнорировать все другие вещи, кроме значений вершин, поскольку мне нужно использовать только те значения. пожалуйста, помогите мне с этим.

+0

Что вы написано до сих пор? –

+0

Если формат действительно такой же жесткий, как показывает пример, вы можете просто использовать конструкции 'input_stream >> ...', возможно, сохранить результат в 'std :: tr1 :: array '. Оператор In-Stream пропустит все пробелы, и вы можете просто выгрузить текстовые части в фиктивную строку. Хорошей идеей является также упаковка этого, как было предложено ниже. –

ответ

2

Вы можете обернуть матрицу в классе и создать оператор пользовательского извлечения для него:

struct MyMatrix { 
    double values[3][3]; 
}; 

std::istream & operator >>(std::istream & stream, MyMatrix & value) { 
    std::string dummy; 

    std::getline(stream, dummy); 
    std::getline(stream, dummy); 
    std::getline(stream, dummy); 
    std::getline(stream, dummy); // discard first four lines 
    for(int i = 0; i < 3; i++) 
     stream >> dummy >> value.values[i][0] >> value.values[i][1] 
       >> value.values[i][2]; 

    std::getline(stream, dummy); 
    std::getline(stream, dummy); 
    std::getline(stream, dummy); 
    std::getline(stream, dummy); // discard last four lines 

    return stream; 
} 

С помощью этого оператора, вы можете прочитать весь файл, как это:

std::ifstream file("data.txt"); 
std::vector<MyMatrix> data(std::istream_iterator<MyMatrix>(file), 
          (std::istream_iterator<MyMatrix>())); 
Смежные вопросы