2016-09-30 3 views
0

Я кодирую на C++ с помощью Visual Studios, и мой код будет принимать только файл под названием «perm15K.txt». Если я попытаюсь ввести «perm30K.txt» или «sorted15K.txt», мой код не будет читать из него. Он не выводит ошибку с файлом, но он не позволит мне ввести, какой поиск я хотел бы выполнить.Код будет принимать только один пользовательский входной файл вместо других

#include "stdafx.h" 
#include "binarysearchtree.h" 
#include "redblacktree.h" 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <ctime> 
#include <chrono> 

using namespace std; 

int main() 
{ 
struct bstnodes *root = NULL; 

std::ifstream in; 
std::ofstream out; 

std::stringstream buffer; 
buffer << in.rdbuf(); 
std::string test = buffer.str(); 
std::cout << test << std::endl << std::endl; 

ifstream myFile; 
string input; 
string output; 

cout << "Name of the input file? (ie. perm15K.txt)"; 
getline(cin, input); 
myFile.open(input.c_str()); 

if (myFile.fail()) 
{ 
    cout << "Error with file\n"; 
} 

    for (int j = 0; j < 10; j++) 
    { 

     cout << "Which search? Pleast enter bst or redblack\n"; 

     binarysearchtree temp; 
     redblacktree temp1; 

     while (!myFile.eof()) 
     { 
      while (getline(myFile, input)) { 
       myFile >> input; 
       string words = input; 

       temp.insert(words); 
       temp1.rbinsert(words); 
      }  
     } 
     getline(cin, input); 
      if (input == "bst") 
      { 
       cout << "\nSearch for what word in the tree\n"; 
       getline(cin, input); 
       temp.insert(input); 

       clock_t start_s = clock(); 
       std::cout << "Match Found: " << temp.search(input) <<  std::endl; 
       clock_t stop_s = clock(); 
       double sum = ((double)(stop_s - start_s)); 
       cout << endl << "Time: " << sum << " seconds" << endl; 

       cout << "\nSearch for what word in the tree\n"; 
       getline(cin, input); 
      } 

      if (input == "redblack") 
      { 
       cout << "\nSearch for what word in the tree\n"; 
       getline(cin, input); 
       temp1.rbinsert(input); 
       clock_t start_s = clock(); 
       temp1.rbsearch(input); 
       std::cout << "Match Found: ";      
       clock_t stop_s = clock(); 
       double sum = ((double)(stop_s - start_s)); 
       cout << endl << "Time: " << sum << " seconds" << endl; 
       cout << "\nSearch for what word in the tree\n"; 
       getline(cin, input); 
      } 

     myFile.close(); 
    return 0; 
} 
} 

Любая помощь в выяснении моей проблемы приветствуется. Это похоже на то, что я застрял в бесконечной петле. Я пытаюсь найти проблему в течение пары часов и не могу найти решение.

ответ

0

Попробуйте найти, где Visual Studio помещает ваш исполняемый файл, и посмотреть, есть ли там другие текстовые файлы.

Также в ваших заявках на печать должно быть указано cout < < "текст" < < endl; Если вы завершаете их «\ n», на самом деле вы не можете очищать буфер печати, что может привести к потере вывода ошибки.

+0

Я изменил \ n в конце, и это не имело значения. Текстовые файлы находятся в папке исполняемого файла и решения и классов. –

+0

Когда вы действительно заботитесь о получении отладочного сообщения, используйте 'cerr', а не' cout'. – user4581301

1

Возможно, если сбой открытия файла !myFile.eof() никогда не является ложным, так как myFile.getline() не ведет себя так, как ожидалось (бесконечный цикл).

Вы должны вернуться после сообщения об ошибке, если сбой открытия.

Кроме того, вы должны сделать только while(myFile.getline()), а не проверять наличие eof.

+0

Можете ли вы показать мне код, что вы подразумеваете под этим? –

+2

Просто удалите строку 'while (! MyFile.eof()) в целом. –

+0

Я сделал это, и он ничего не исправить. –

Смежные вопросы