2017-02-19 3 views
1

Ich habe hier einen Code geschrieben, der zeilenweise eine Eingabedatei liest und einen Vektorenvektor erstellt, den ich dann später in meinen Hausaufgaben als Matrix verwende. Dies ist der Code:Eingabedateiüberprüfung mit getline an >> operator in 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); 
} 

Einige Eingabedateien enthalten jedoch möglicherweise nicht ganzzahlige Werte. Ich möchte eine Eingabeprüffunktion für die Matrixerstellung integrieren, damit mein Programm beendet wird, wenn in der Eingabedatei ein nicht ganzzahliger Wert ist.

Wie kann ich das erreichen? Wäre es möglich, irgendwo in dieser while-Schleife oder woanders im Code zu schreiben?

Vielen Dank im Voraus.

+4

[Warum Iostream ist :: EOF innerhalb einer Schleife Bedingung als falsch? ] (https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-sidered-wrong) – Biffen

Antwort

0

Ich möchte eine Eingabeprüfung Funktion für die Matrix Schöpfung integrieren, so dass, wenn eine nicht-ganze Zahl ist, Wert in der Eingabedatei, würde mein Programm beenden.

Die stringstream führt diese Überprüfung bereits für Sie durch. Sie können den Status einfach nach der while-Schleife testen. Wenn ein nicht ganzzahliger Wert nicht analysiert werden konnte, wird das Failbit auf True gesetzt.

Hier ist ein working demo (mit einigen kleinen Verbesserungen):

#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; 
} 

Eingang

12 13 46 3 
42 2.6 5 

Ausgabe

Bad input detected! 
1

Von cppreference.com:

Wenn Extraktion ausfällt, Null auf den Wert geschrieben und failbit gesetzt. Wenn die Extraktion den Wert zu groß oder zu klein ergibt, um in value zu passen, wird std :: numeric_limits :: max() oder std :: numeric_limits :: min() geschrieben und Failbit-Flag gesetzt.

So können Sie einfach fügen Sie eine if-Klausel nach der while-Schleife:

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

'wenn (! Ss) {...' sollte ausreichen. –