2017-01-02 6 views
1

У меня возникла проблема при запуске кода ниже. Каждый раз, когда я устанавливаю время цикла для достижения .eof() возвращает зЬй :: bad_allocПочему я получаю ошибку std :: bad_alloc

inFile.open(fileName, std::ios::in | std::ios::binary); 

     if (inFile.is_open()) 
     { 
      while (!inFile.eof()) 
      { 
       read(inFile, readIn); 
       vecMenu.push_back(readIn); 
       menu.push_back(readIn); 
       //count++; 
      } 

      std::cout << "File was loaded succesfully..." << std::endl; 

      inFile.close(); 
     } 

Он работает отлично, если я установил заранее заданное число итераций, но терпит неудачу, когда я использую EOF Funtion. Вот код для функции чтения:

void read(std::fstream& file, std::string& str) 
{ 
    if (file.is_open()) 
    { 
     unsigned len; 
     char *buf = nullptr; 

     file.read(reinterpret_cast<char *>(&len), sizeof(unsigned)); 

     buf = new char[len + 1]; 

     file.read(buf, len); 

     buf[len] = '\0'; 

     str = buf; 

     std::cout << "Test: " << str << std::endl; 

     delete[] buf; 
    } 
    else 
    { 
     std::cout << "File was not accessible" << std::endl; 
    } 
} 

Любая помощь, которую вы можете предоставить, очень ценится. Примечание: Я не упомянул, что vecMenu имеет тип станд :: вектор и меню типа станд :: Список

+3

Пожалуйста, смотрите этот пост: [? Почему iostream :: ВФ внутри условия цикла считается неправильным] (http://stackoverflow.com/questions/ 5605125/why-is-iostreameof-inside-a-loop-condition-accepted-wrong) – Rakete1111

+0

Спасибо @ Rakete1111 – Akatosh

+1

Кроме того, вызов распределителя для каждой отдельной строки, которую вы читаете, замедляет вашу программу. Лучше использовать нелокальный 'std :: vector' и вызывать' resize() 'вызов, чем вызывать' new/delete' вызовы каждый раз. – PaulMcKenzie

ответ

1

Основные проблемы, которые я вижу, являются:

  1. Вы используете while (!inFile.eof()) до конца петля. См. Why is iostream::eof inside a loop condition considered wrong?.

  2. Вы не проверяете, были ли вызовы ifstream::read, прежде чем использовать переменные, которые были прочитаны.

Я предлагаю:

  1. Изменение версии read вернуть ссылку на ifstream. Он должен вернуть ifstream, который требуется для ввода. Это позволяет использовать вызов в read в условии цикла.

  2. Проверка правильности выбора номера ifstream::read перед использованием.

  3. Посылка вызова read в условное обозначение while.

std::ifstream& read(std::fstream& file, std::string& str) 
{ 
    if (file.is_open()) 
    { 
     unsigned len; 
     char *buf = nullptr; 

     if !(file.read(reinterpret_cast<char *>(&len), sizeof(unsigned))) 
     { 
     return file; 
     } 

     buf = new char[len + 1]; 

     if (!file.read(buf, len)) 
     { 
     delete [] buf; 
     return file; 
     } 

     buf[len] = '\0'; 

     str = buf; 

     std::cout << "Test: " << str << std::endl; 

     delete[] buf; 
    } 
    else 
    { 
     std::cout << "File was not accessible" << std::endl; 
    } 

    return file; 
} 

и

inFile.open(fileName, std::ios::in | std::ios::binary); 

if (inFile.is_open()) 
{ 
    std::cout << "File was loaded succesfully..." << std::endl; 

    while (read(inFile, readIn)) 
    { 
     vecMenu.push_back(readIn); 
     menu.push_back(readIn); 
     //count++; 
    } 

    inFile.close(); 
}