Ошибка выделения массива символов C ++ - PullRequest
1 голос
/ 04 декабря 2010

У меня есть функция, предназначенная для получения содержимого файла:

bool getFileContents(std::string loc, std::string &code) {
    std::ifstream file(loc.c_str());

    if(!file.is_open())
        return err("Source file could not be read");

    int length;
    file.seekg(0, std::ios::end);
    length = file.tellg();
    file.seekg(0, std::ios::beg);

    char *buffer = new char[length];
    file.read(buffer, length);
    code = buffer;
    delete[] buffer;

    file.close();

    return true;
}

Когда я запускаю эту функцию, длина файла всегда определяется точно.Однако, если я вызываю функцию один раз с файлом, вызываю ее снова с несуществующим файлом, а затем вызываю ее еще раз с исходным файлом, строка символов 'buffer' больше, чем int 'length'.

Что ж, это может быть неточно, скорее - когда строка «буфер» копируется в строку «код», «код» длиннее, чем «длина».В каждом случае 'code' создается непосредственно перед вызовом 'getFileContents', поэтому это не относится к предыдущему значению.

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

У меня мало опыта со строками символов, и я понимаю, что я их не правильно использую, но пришел код, который я используюиз примера, и я не могу на всю жизнь найти что-то не так с ним.

Спасибо за любую помощь, Уайетт

Ответы [ 2 ]

3 голосов
/ 04 декабря 2010

Ну, проблема в том, что code = buffer полагается на символ NUL (\ 0), чтобы знать, где заканчивается буфер. Иногда вы можете случайно получить символ NUL (особенно когда программа только началась), но не всегда. Отсюда и прерывистое поведение.

Попробуйте заменить code = buffer на code = std::string(buffer, length).

0 голосов
/ 04 декабря 2010

Помимо проблемы \ 0, описанной aix , вы делаете двойное распределение, которое здесь не нужно и небезопасно (это может быть исключением до delete, и у вас будет утечка памяти ). Вместо этого вы можете выделить буфер внутри строки следующим образом:

code.resize(length);
file.read(&code[0], length);

И не забудьте проверить возвращаемое значение read. Не гарантируется, что все length байтов будут прочитаны за один шаг.

...