2015-08-08 2 views
0

Я знаю, что есть много ответов уже на то, как итерации ifstreams, но не из них действительно помогли мне найти решение.Iterate over ifstream

Моя проблема: У меня есть txt-файл, содержащий несколько строк данных. Первая строка txt-файла сообщает мне, как складывается остальная часть данных. , например, это мой TXT файл:

5 5 5 
0.5 0.5 0.5 
0 0 0 
0 0 1 
0 0 -1 
0.5 1 0 
0 0 -1 0 
0 0 1 1 
0 -1 0 1 
1 0 0 3 
0 1 0 1 
... 

так что это должно сказать свою программу, чтобы сделать

double a,b,c 
inf >> a >> b >> c 

в течение первых 5 строк

double a,b,c,d 
inf >> a >> b >> c >> d 

в течение следующих 5 строк и т.д.

Я думаю, я мог бы сделать это, используя getLine(), а затем разбивая результирующую строку на каждом "", но мне было интересно, есть ли какой-нибудь «чистый» способ сделать это.

+0

Не уверен, что вы просите. У вас проблема? Если так, то, что это? –

+1

Получение строк с использованием ['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline) - хорошее начало. Затем вы можете поместить их в ['std :: istringstream'] (http://en.cppreference.com/w/cpp/io/basic_istringstream) и использовать обычный оператор ввода' >> 'для получения номеров строк. –

+0

Вы делаете форматированный * line * input. Чтение каждой строки и обработок, это отформатированный макет, по тому самому определению, правильный способ сделать это. – WhozCraig

ответ

0

Почему вы не петляете?

for(int i = 0; i < 5; i++) { 
    double a,b,c; 
    inf >> a >> b >> c; 
    // Do something with a,b,c 
} 

for(int i = 0; i < 5; i++) { 
    double a,b,c,d; 
    inf >> a >> b >> c >> d; 
    // Do something with a,b,c,d 
} 
+0

когда 'inf >>' перейти к следующей строке? после использования каждого слова в строке? – ThomasS

+0

Он перейдет к следующей строке при поиске двойника, не волнуйтесь. – mostruash

0

да использование GetLine в время цикла и анализировать данные с помощью istringstream и istream_iterator и сохранить отдельные данные в векторе.

int main() 
{ 

std::ifstream infile(<absolute path to file>); 
std::string input="0 0 -1 0"; 
std::vector<std::vector<float>> data; 
while(getline(infile,input)) 
{ 
    std::istringstream iss(input); 
    std::vector<float> input_data{istream_iterator<float>{iss}, 
         istream_iterator<float>{}}; 
    data.push_back(input_data); 
} 

for(const auto & x: input_data) 
    std::cout<<x<<" "; 
}