2016-07-11 3 views
0

Одна из вещей, которую должна выполнить моя программа, - это проверить файл с помощью функции isValid, введенной пользователем, и будет продолжать делать это до тех пор, пока не будет введен выход, и если я введу только действительный файл имен нет проблем. Но когда я ввожу недопустимое имя файла, за которым следует действительное имя файла, он все еще говорит, что файл недействителен, и я не могу понять, почему, и я попытался отладить его, а что нет и до сих пор не может найти проблему. Любая помощь будет принята с благодарностью!Не удалось проверить файл снова и снова

# 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(); 

    } 
} 

ответ

1
ifstream my_file(file_name.c_str()); 

Это не заменяет my_file вы уже создали во внешней области видимости. Он просто создает новую локальную переменную, которая живет как наносекунда.

Вам необходимо закрыть, затем повторно открыть существующий my_file, не забудьте также сбросить его флаги ошибок.

0

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

Вам необходимо проверить значение file_name сразу после его ввода, а не после его обработки в цикле while один раз.

Вы должны использовать что-то вдоль линий:

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

где

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

Другие улучшения:

  1. Вызов cin.ignore() будет проблемная строка с std::getline не оставляет символ новой строки во входном потоке. Вам нужно будет ввести . Введите еще раз. Вы должны удалить его.

  2. Вам не нужна линия cin.clear(). Вам нужно cin.clear(), только если ошибка была обнаружена при чтении из потока - например, при использовании cin >> var;, когда входной поток не имел правильных данных, подходящих для var.

  3. Вам не нужно открывать файл, если файл недействителен.

  4. Вам не нужно несколько строк ifstream my_file(file_name.c_str());. Вам понадобится только один раз, перед вызовом Output_function(my_file).

  5. Вам не нужно явно звонить my_file.close(). Файл будет закрыт и конец области.

Предлагается упрощенная версия 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); 
    } 
} 
Смежные вопросы