2016-12-08 10 views
3

обрабатывают некоторые данные с данными в колонках, как,Можно ли «выбросить» значение чтения из входного потока?

1 -0.004002415458937208 0.0035676328502415523 
2 -0.004002415796209478 0.0035676331876702957 
.... 

Я заинтересован только в двух последних значениях. Обычно я нахожу это удобно считывать значения, как:

std::ifstream file(file_name); 
double a, b; 
for (lines) { 
    //  | throwing away the first value by reading it to `a` 
    file >> a >> a >> b; 
    store(a, b); 
} 

Я не знаю, как это читаемыми для других, и это может рассматриваться как ошибка, когда структура данных не известна. Мог ли я каким-то образом сделать это более явным, что я действительно хочу выбросить первое значение чтения?

Я хотел что-то в строке, но ничего не получалось:

file >> double() >> a >> b; // I hoped I could create some r-value kind of thing and discard the data in there 
file >> NULL >> a >> b; 
+3

'_' является допустимым идентификатором, и я видел, как он раньше использовался для переменных с неиспользуемым содержимым. Другие имена: 'disarded',' ignored', 'consumed',' unused', 'destroyer_of_hope' (ну, ладно, не последний) – jaggedSpire

+0

Я называю переменную, называемую eater, и которая ест ненужный вход. – NathanOliver

+0

Я думал, что создание переменной для нее было бы излишним, и не используя его впоследствии, создало бы предупреждение (которое я понимаю, это не так). Это может быть достойным обходным решением. – pingul

ответ

9

Если вы не хотите, чтобы создать переменную явно будет проигнорировано, и вы чувствуете, явно игнорируя значение с вызовы для управления потоком слишком многословным, вы можете воспользоваться перегрузкой operator>> для std::istream, который принимает std::istream&(*)(std::istream&) функцию указатель на:

template <typename CharT> 
std::basic_istream<CharT>& ignore(std::basic_istream<CharT>& in){ 
    std::string ignoredValue; 
    return in >> ignoredValue; 
} 

использоваться как:

std::cin >> ignore >> a >> b; 

и если вы хотите, чтобы убедиться, что он был в форме, которая может быть прочитана в тип можно указать дополнительный аргумент шаблона, определяющий тип игнорировал значения:

// default arguments to allow use of ignore without explicit type 
template <typename T = std::string, typename CharT = char> 
std::basic_istream<CharT>& ignore(std::basic_istream<CharT>& in){ 
    T ignoredValue; 
    return in >> ignoredValue; 
} 

использоваться как:

std::cin >> ignore >> a >> b; 
// and 
std::cin >> ignore<int> >> a >> b; 

demo on coliru

+0

Действительно красиво и работает как шарм. Отличный ответ! – pingul

7

Вы можете использовать std::istream::ignore.

т.д .:

file.ignore(std::numeric_limits<std::streamsize>::max(), ' '); //columns are separated with space so passing it as the delimiter. 
file >> a >> b; 
+0

Хороший ответ. Я чувствую, что это немного подробный, и что он побеждает цель короткого 'файла >> a >> a >> b;'. – pingul

+0

@pingul хорошо, вы можете создать собственный манипулятор потока, чтобы сделать синтаксис немного красивее. Взгляните на этот ответ. Это должно быть легко принять в соответствии с вашими потребностями: http://stackoverflow.com/a/29414164/2355119 –

1

Вы можете использовать файл :: игнорировать (255, ' «), чтобы игнорировать символы до следующего места.

std::ifstream file(file_name); 
double a, b; 
for (lines) { 
    // skip first value until space 
    file.ignore(255, ' '); 
    file >> a >> b; 
    store(a, b); 
} 

или вы можете использовать вспомогательную переменную для хранения первого значения:

std::ifstream file(file_name); 
double aux, a, b; 
for (lines) { 
    // skip first value 
    file >> aux >> a >> b; 
    store(a, b); 
} 
+4

'file.ignore()' должен использовать 'std :: numeric_limits :: max() 'игнорировать все символы до следующего пробела. Использование '255' искусственно ограничивает вас до 255 игнорируемых символов. –

+0

Я думаю, что это не проблема, потому что первые данные представляют собой целое число. Проблема может заключаться в том, что линия начинается с 1 или более пробелов. В этом случае код не работает по мере необходимости! –

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

  • Нет связанных вопросов^_^