2017-02-19 18 views
1

Я написал здесь код, который читает входной файл по строкам и создает вектор векторов, который затем я использую в качестве матрицы позже в своей домашней работе. Это код:Проверка входного файла с использованием getline a >> operator в C++

vector<vector<int>> inputMatrix; 
string line; 
while(!file.eof()) 
{ 
    getline(file, line); 
    stringstream ss(line); 

    int num; 
    vector<int> temp; 

    while(ss >> num) 
    { 
     temp.push_back(num);   
    } 
    inputMatrix.push_back(temp); 
} 

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

Как я могу это достичь? Можно ли написать где-нибудь в этом цикле или где-то еще в коде?

спасибо, что заранее.

+4

[Почему iostream :: ВФ внутри условия цикла считается неправильным? ] (https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – Biffen

ответ

0

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

stringstream уже проверяет это. Вы можете просто проверить свое состояние после цикла while. Если ему не удалось проанализировать не целое значение, для failbit будет установлено значение true.

Вот working demo (с некоторыми небольшими улучшениями):

#include <iostream> 
#include <vector> 
#include <sstream> 
using namespace std; 

int main() { 
    vector<vector<int>> inputMatrix; 
    string line; 
    while(getline(cin, line)) 
    { 
     istringstream iss(line); 

     int num; 
     vector<int> temp; 

     while(iss >> num) 
     { 
      temp.push_back(num);   
     } 
     if(!iss) { 
      cout << "Bad input detected!" << endl; 
      return 1; 
     } 
     inputMatrix.push_back(temp); 
    } 
    return 0; 
} 

Входной

12 13 46 3 
42 2.6 5 

Выход

Bad input detected! 
1

От cppreference.com:

Если экстракция не удается, ноль записывается значение и failbit устанавливается. Если извлечение приводит к слишком большому или слишком маленькому значению, чтобы соответствовать значению , std :: numeric_limits :: max() или std :: numeric_limits :: min() записывается и устанавливается флаг сбоя.

Таким образом, вы могли бы просто добавьте, если п после времени цикла:

while (ss >> num) 
{ 
    temp.push_back(num); 
} 
if (ss.fail()) // explicitly check for failbit 
{ 
    expected_integer_error(); 
} 
+0

'if (! Ss) {...' должно быть достаточно. –