2016-07-11 17 views
0

Eines der Dinge, die mein Programm tun muss, ist eine Datei mit der vom Benutzer eingegebenen isValid-Funktion zu validieren, und dies wird so lange fortgesetzt, bis Exit eingegeben wird und ich nur eine gültige Datei eingib Namen gibt es keine Probleme. Aber wenn ich einen ungültigen Dateinamen gefolgt von einem gültigen Dateinamen gebe, sagt es immer noch, die Datei ist ungültig und ich kann nicht herausfinden, warum und ich habe versucht, es zu debuggen und was nicht und kann immer noch nicht das Problem finden. Jede Hilfe würde sehr geschätzt werden!Probleme beim wiederholten Überprüfen einer Datei

# include <iostream> 
#include <string> 
#include<fstream> 
#include<vector> 
using namespace std; 

void Open_file(string name) 
{ 
    ifstream my_file; 
    my_file.open(name.c_str()); 
} 


bool isValid(ifstream& file, string name) 
{ 
    if ((name.substr(name.length() - 4)) != (".htm")) 
    { 
     return false; 
    } 

    cout << file << endl; 
    if (file.good()) 
    { 
     return true; 
    } 

    else 
    { 
     return false; 
    } 
} 


string File_title(ifstream& my_file) 
{ 
    string title; 
    string line; 
    size_t first_title; 
    size_t second_title; 
    string str; 

    while((getline(my_file,line))) 
    { 
     str = str + line; 
    } 

    first_title = str.find("<title>"); 
    second_title = str.find("</title>"); 
    title = str.substr(first_title + 7, (second_title) - (first_title + 7)); 

    return title; 
} 


void Output_function(ifstream& my_file) 
{ 

    string line; 
    ifstream MyFile("titles.txt"); 


    string g = File_title(my_file); 
    while(getline(MyFile, line)) 
    { 
     if((g == line)) 
     { 
      return; 
     } 
    } 

    ofstream out_title("titles.txt", fstream::app); 
    out_title << g << endl ; 
} 

void Clear_file() 
{ 

    ofstream out_title("titles.txt"); 
    out_title << "" << endl; 

} 



int main() 
{ 

    string file_name; 

    while (file_name != "exit") 
    { 
     cout <<"please enter a HTML file name or hit 'exit' to quit and " << endl; 
     cout << "if you want to clear file please enter 'clear': "; 
     getline(cin,file_name); 
     ifstream my_file(file_name.c_str()); 
     cin.ignore(256, '\n'); 
     if(file_name == "clear") 
     { 
      Clear_file(); 
      break; 

     } 
     while ((isValid(my_file, file_name) == false)) 
     { 
      cin.clear(); 
      cout <<"Invalid file name, please enter a valid file name: "; 
      getline(cin,file_name); 
      ifstream my_file(file_name.c_str()); 


     } 

     Open_file(file_name); 
     Output_function(my_file); 



     my_file.close(); 

    } 
} 

Antwort

1
ifstream my_file(file_name.c_str()); 

Dies ersetzt nicht die my_file Sie bereits in einem äußeren Rahmen geschaffen würde. Es macht nur eine neue lokale Variable, die für eine Nanosekunde lebt.

Sie müssen schließen, dann öffnen Sie die vorhandene my_file, sicher sein, seine Fehler Flags auch zurückgesetzt.

0

Die Logik, mit der Sie die Schleife verlassen, ist fehlerhaft.

Sie müssen den Wert file_name direkt nach der Eingabe überprüfen, nicht nach der Verarbeitung in der while Schleife einmal.

Sie brauchen etwas entlang der Linien von verwenden:

while ((file_name = get_file_name()) != "exit") 
{ 
    ... 
} 

wo

std::string get_file_name() 
{ 
    std::string file_name; 
    cout <<"please enter a HTML file name or hit 'exit' to quit and " << endl; 
    cout << "if you want to clear file please enter 'clear': "; 
    getline(cin,file_name); 
    return file_name; 
} 

Weitere Verbesserungen:

  1. Der Aufruf von cin.ignore() sein wird, eine Problemlinie seit std::getline lässt das Zeilenumbruchzeichen im Eingabestream nicht stehen. Sie müssen eingeben Geben Sie noch einmal ein. Sie sollten es entfernen.

  2. Sie benötigen keine cin.clear() Zeile. Sie benötigen cin.clear() nur, wenn beim Lesen aus dem Stream ein Fehler festgestellt wurde - z. B. bei Verwendung von cin >> var;, wenn der Eingabestream nicht die richtigen Daten für var hatte.

  3. Sie müssen die Datei nicht öffnen, wenn die Datei nicht gültig ist.

  4. Sie benötigen nicht mehrere Zeilen ifstream my_file(file_name.c_str());. Sie brauchen es nur einmal, kurz vor dem Anruf an Output_function(my_file).

  5. Sie müssen nicht explizit my_file.close() aufrufen. Die Datei wird geschlossen und das Ende des Bereichs angezeigt.

Hier ist eine vereinfachte Version von main.

int main() 
{ 
    string file_name; 

    while ((file_name = get_file_name()) != "exit") 
    { 
     if(file_name == "clear") 
     { 
     Clear_file(); 
     break; 
     } 

     while (isValid(my_file, file_name) == false) 
     { 
     cout <<"Invalid file name, please enter a valid file name: "; 
     getline(cin,file_name); 
     } 

     Open_file(file_name); 
     ifstream my_file(file_name.c_str()); 
     Output_function(my_file); 
    } 
} 
Verwandte Themen