2015-09-22 3 views
2

Я читаю текстовый файл, используя ifstream на VS2012 C++. Есть ли простой способ пропустить строки чтения, содержащие «NaN»? Образецifstream: Пропустить строки считывания, содержащие NaN

ifstream loadFile; 
loadFile.open("data.txt", ios::in); 

double x; 
int numLine = 3; 
int numCol = 4; 
vector< vector<int> > data(numLine, vector<int> numCol); 

for(int i=0; i< numLine; i++){ 
    for (int j=0; j< numCol; j++){ 
     loadFile >> x ; 
     data[i][j] = x; 
    } 
} 

Файл:

2.4 4.6 6.8 0.34 
5.34 3.4 NaN 1.1 
2 -4 -6 5 
+0

Ваши строки - это записи? Я имею в виду, каждая строка содержит 4 номера? – Wolf

+0

да, каждая строка содержит 4 номера. – askingtoomuch

ответ

1

Трудно определить, что входная строка была буквально "NaN", но вы можете сделать

if (!(loadFile>>x)) // Read might fail on "NaN" 
{ 
    loadFile.clear(); // Reset error state 
    loadFile.ignore(3); // This assumes we only fail on NaN. 
} 

Это игнорирует только один вход , Конечно, если ваш вход может содержать -NaN или другие входы с длиной! = 3, то вам нужно быть немного умнее. И если вам нужно игнорировать всю строку, тогда вам нужно сбросить i после неудачной строки.

+0

Да, мне нужно игнорировать всю линию. clear() заставляет его работать! Также полезно знать об игнорировании(). Благодарю. – askingtoomuch

+0

@askingtoomuch Это пропускает только одно число, а не всю строку. Как это работает *? Не лучше ли работать на целых входных линиях? – Wolf

+0

@Wolf: Вы заставляете его работать, продолжая всю линию, как будто ничего не произошло, только установив флаг «badLine». В конце строки, если флаг установлен, уменьшите 'i' (индекс строки) и очистите флаг. Это перезаписывает записи 'data [i] [*]'. – MSalters

0

Вы можете использовать isnan функцию: http://en.cppreference.com/w/cpp/numeric/math/isnan

+0

Я не мог прочитать «NaN», поскольку я читаю «double». Одно из решений моей проблемы - прочитать «строка». Мне просто интересно, есть ли какое-то простое решение, если я просто хочу прочитать «double». – askingtoomuch

+0

Существует версия 'isnan', которая принимает удвоения ... – Buddy

+0

В моем коде выше значение x не читается ни в каком значении, когда оно читает« NaN », оно сохраняет предыдущее значение и застряло там до конец петель. Что-то вроде этого: 5.34 3.4 3.4 3.4 3.4 3.4 3.4 – askingtoomuch

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

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