bad_alloc C ++ при использовании конструктора std :: string с указателем на символ - PullRequest
0 голосов
/ 16 мая 2018

Я нахожусь в процессе создания простой программы на C ++ (11).

Моя проблема заключается в том, что функция loadRoomsFile () читает текст из файла в массив указателей на символы и затем возвращаетit.

Я хочу преобразовать его в строку, поэтому я использовал строковый конструктор с параметром * char array.

Все тесты показывают, буфер также показывает правильные данные, но при вызове строки (loadRoomsFile ()) Я получаю исключение bad_alloc, и программа останавливается.Кто-нибудь может мне помочь?

char *loadRoomsFile() {

fstream roomsFile;
char *buffer;

// helper
int i = 0;

cout << "TEST 1" << endl;

roomsFile.open("rooms.txt");

cout << "TEST 2" << endl;

if(roomsFile.is_open()) {

    cout << "TEST 3" << endl;
    roomsFile.seekg(0, ios::end);
    cout << "TEST 4" << endl;
    buffer = new char[roomsFile.tellg()];
    cout << "TEST 5" << endl;
    roomsFile.seekg(0, ios::beg);
    cout << "TEST 6" << endl;
    while(!roomsFile.eof()) {

        cout << "TEST WHILE" << endl;
        buffer[i] = roomsFile.get();
        i++;
    }
    cout << "TEST 7" << endl;
}

roomsFile.close();
cout << "TEST 8" << endl;

buffer[i] = '\0';
cout << "TEST 9" << endl;
cout << buffer << endl;

return buffer;
}


/*
 * GENERAL FUNCTION
*/

int main() {

// Variables
int currentSection; // option choosed in Main Menu
int revert = true; // used for going back in time XD
//string roomsData; // used for storage of data from file
vector<Room> rooms;

cout << "----------------------------------------------------------------" << endl;
cout << "Conference Room Manager ver. 0.1" << endl;
cout << "Component 1/4, Bartosz Kubacki/Bartlomiej Urbanek" << endl;
cout << "----------------------------------------------------------------" << endl;

cout << endl;

// load all data from files
cout << "TEST MAIN" << endl;
string roomsData(loadRoomsFile());

return 0;
}

Спасибо!

1 Ответ

0 голосов
/ 16 мая 2018

Во-первых: вы должны были предоставить Минимальный, Полный и Проверяемый пример вместо того, чтобы заставлять нас исправлять ваш код, чтобы даже построить его. Это не относится к нашим усилиям.

Второе: вы выделяете столько символов, сколько размер файла, но затем пишете «\ 0» после последнего 1. Так что, похоже, это особая проблема, вызывающая segfault.

Но на самом деле главная проблема в вашем подходе:

  • Вы не должны выделять память самостоятельно, если вам абсолютно не нужно.
  • Вы не должны читать содержимое всего файла в строку (если только вы не знаете, что она действительно короткая).
  • Вы не должны читать по одному символу за раз из файла. Либо читать построчно с std::getline(); или проанализировать данные с помощью оператора канала (например, cin >> my_float); или прочитайте весь файл сразу; или mmap() файл (это не функция C ++, но Linux, Windows, MacOS и другие поддерживают это).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...