Использование strtof в цикле для разбора чисел из буфера символов

У меня есть вопрос о выделении и освобождении памяти.

Я хочу прочитать буфер символов в цикле и сохранить значения с плавающей точкой в ​​вектор.
Я получаю буфер, читая fstream.

Но мой подход всегда дает сбой при удалении буферов в конце.

Проблема в том, что я меняю буфер во время цикла?
Кто-нибудь знает, как это исправить?

Я благодарен за каждый намек!

char* buffer1 = new char[size]; // the size is given
char* buffer2 = NULL;

fileStream.read(buffer1,size);

while(true)
{
// read double from buffer
// and get pointer to the new buffer -> buffer2
double tempDouble = strtod(buffer1, &buffer2);

// If nothing has been read (buffer stays the same) -> break
if (buffer1 == buffer2)
break;
else // change the buffer to read the next double during the next interation step
buffer1= buffer2;

// collect the doubles
collectedDoubles.push_back(tempDouble);

// if all numbers are read -> break
if (++doubleCount == numDoubles) // termination condition
break;
}

// delete the allocated buffer
delete[] buffer1;

// do I have th delete the 2nd buffer too?
// delete[] buffer2;

0

Решение

  1. Согласно документам strtod:

    Функции устанавливают указатель, на который указывает str_end, чтобы указать на символ после последнего интерпретированного символа. Если str_end равен NULL, он игнорируется.

    Итак, ваш указатель buffer2 все еще NULL и после того, как вы buffer1= buffer2;buffer1 сейчас также NULL (Кстати, здесь утечка памяти, поскольку данные теряются).

  2. я тоже должен удалить второй буфер?

    В этом случае — нет, потому что удаление NULL указатель не работает.

Решение:

Посмотрите на пример, приведенный в документации для strtod функция здесь аналогична вашему коду:

char* buffer1 = new char[size];
char* buffer2;                           // note no NULL here !
char* p = buffer1;                       // we'll modify this in loop

for (double tempDouble = std::strtod(p, &buffer2); p != buffer2; tempDouble = std::strtod(p, &buffer2))
{
p = buffer2;
if (errno == ERANGE){                // check if some error occured during attempt to convertion
std::cout << "range error\n";
errno = 0;
}

collectedDoubles.push_back(tempDouble);

if (++doubleCount == numDoubles)     // termination condition
break;
}

delete[] buffer1;

Изменить 1: Посмотрите на элегантное и очень похожее на C ++ решение, предложенное @JerryCoffin в комментариях к вашему вопросу.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]