2017-09-04 2 views
1

Ich versuche, Eingabe aus einer Datei in C++ zu lesen, und ich muss eine Fehlermeldung ausgeben, wenn keine Eingabe vorliegt.Überprüfen, ob Datei nur Leerzeichen enthält C++

Diese Anweisung funktioniert, wenn die Datei vollständig leer ist:

if (f.peek() == std::ifstream::traits_type::eof()) return error("Empty file"); 

wo Fehler() ist eine einfache Funktion:

int error(string message){ 
    cerr << "ERROR: " << message << "\n"; 
    return -1; 
} 

Wie kann ich überprüfen, für Dateien, die nur Leerzeichen enthalten, so kann ich den gleichen Fehler auslösen? Wie 7 Zeilenumbrüche?
Meine sollte normal weiter ausgeführt werden, wenn die Datei nichts als nur Leerzeichen enthält.

+2

Sie haben jedes Zeichen dann zu lesen und zu prüfen. ['std :: isspace()'] (http://en.cppreference.com/w/cpp/string/byte/ispace) kann dabei nützlich sein. – user0042

+4

Wie groß ist die Wahrscheinlichkeit, dass eine Datei nur Leerzeichen enthält? Dies scheint ein XY-Problem zu sein. –

+0

@Neil Wahr, dass. – user0042

Antwort

0

Sie könnten eine std::istream_iterator über die Dateieingabe verwenden und überprüfen Sie einzelne Zeichen mit std:isspace(), nehme ich an.

Aber ich frage mich, ob dies wirklich ist was Sie tun möchten. Warum nicht versuchen, alles zu lesen, was Sie lesen möchten, und sich nur um Dinge kümmern, wenn Sie nicht lesen/analysieren können?

0

lesen Zeichen und die Überprüfung mit std::isspace kann helfen. so etwas wie dieses:

char c; 
bool isEmpty = true; 
while (f.get(c)) 
{ 
    if(!std::isspace(c)) 
    { 
    isEmpty = false; 
    break; 
    } 
} 

diese Weise wird isEmpty sein, was es sagt

1

die Datei im Voraus Scannen, wenn es nur Leerzeichen enthält sehr ineffizient wäre.

Ich glaube, was Sie wirklich brauchen, ist, den Überblick zu behalten, wenn einige nicht-Leerzeichen Daten überhaupt gelesen werden können, und die Fehler zu erhöhen, wenn nicht:

std::string line; 
    std::vector<std::string> lines_with_data; 
    while(std::getline(f,line)) { 
     // check if line is empty or contains only whitespace 
     if(!(line.empty() || 
      (std::find_if_not(line.begin(),line.end(),std::isspace) != line.end())) { 
      lines_with_data.push_back(line); 
     }   
    } 
    if(lines_with_data.empty()) { // No data could be found 
     return error("Empty file"); 
    } 
+1

Danke, dieser Ansatz funktionierte (Überprüfung nach dem Parsen) und ich habe mich geirrt, zu versuchen, in einer ähnlichen Weise zu überprüfen, nach einer leeren Datei zu überprüfen. – db236

Verwandte Themen