2012-05-30 3 views
0

Я пишу программу, читающую файл, содержащий два значения в каждой строке. Эти значения должны храниться в двух векторах, xVals и yVals. Поэтому я использую функцию push_back, но я хочу, чтобы мой код был более красивым. Теперь это как:Передача fstream ">>" как аргумент функции

ifstream file; 
file.open("foo.txt"); 
double TempVal; 
while(file >> TempVal){ 
    xVals.push_back(TempVal); 
    file >> TempVal; 
    yVals.push_back(TempVal); 
} 

То, что я в настоящее время ищет это решение, как этот (только важная линия):

while(file >> xVals.push_back(??) >> yVals.push_back(??)) 

Вопросительные знаки стоят на «Я не знаю, как получить значение, переданное «>>» там ... есть простой (легче, чем три строки выше) или лучше способ достичь этого? :-)

Благодаря

+1

Красота находится в глазу созерцания r, я полагаю, но то, что вы называете красивым, я называю ** запутанным **. –

+0

Вы действительно считаете, что ваш код будет красивее, когда он нечитабелен? – undu

+0

Ну, я мог бы избежать временной переменной ;-) – AnatraIlDuck

ответ

5

Вы могли бы сделать что-то как это:

double tempX, tempY; 
while(file >> tempX >> tempY) 
{ 
    xVals.push_back(tempX); 
    yVals.push_back(tempY); 
} 

Если вы действительно хотели что-то красивый, вы бы определить Point класс, который выполняет извлечения потока/вставки, а затем просто использовать алгоритм:

std::vector<Point> points; 
std::copy(
    std::istream_iterator<Point>(file), std::istream_iterator<Point>() 
    , std::back_inserter(points) 
); 
+2

+1 Первый рефакторинг отражает симметрию намного лучше, чем код OP. – dasblinkenlight

+0

, что (первая) сделает это, но использует две временные переменные. Второй, который я должен отразить ... – AnatraIlDuck

+0

@Vincent: у вас есть два временных компонента, что не так с двумя временными переменными? –

0

Просто, чтобы избежать использования из TempVal вы можете напрямую использовать векторные экземпляры:

while(file.good() && !file.eof()) 
{ 
    xVals.resize(xVals.size() + 1,0.0); 
    yVals.resize(yVals.size() + 1,0.0); 
    file >> xVals.back() >> yVals.back(); 
} 
+0

Хорошо, это решение также приятно, но, как указано выше, временные переменные не так уж плохи, как я думал :-) – AnatraIlDuck

+0

Пожалуйста, не используйте '.eof()' как условие цикла. Он почти всегда производит код ошибки, как и в этом случае. Ваш код выполняет бесконечный цикл при наличии некорректного ввода. –

+0

@Rob: Добавлена ​​проверка входного потока. Теперь лучше? Объясните, пожалуйста, если это не поможет. –

Смежные вопросы