Странные символы при попытке получить char * из fstream

Я пытаюсь прочитать 4 символа в определенной позиции из файла. Код прост, но результат действительно сбивает с толку:

fstream dicomFile;
dicomFile.open(argv[1]);
dicomFile.seekg(128,ios::beg);
char * memblock = new char [4];
dicomFile.read(memblock,4);
cout<<"header is "<<memblock<<endl;

В идеале результат должен быть «DICM», но фактический результат из консоли был «DICM» плюс странные символы, как показано на рисунке. Более того, каждый раз, когда я запускаю его, персонажи разные. Я предполагаю, что это может быть что-то про ASCII и Unicode, я попытался изменить свойство проекта с Unicode на multibytes, а затем изменить обратно, без разницы.

введите описание изображения здесь

Кто-нибудь знает, что здесь происходит и как мне это решить, пожалуйста? Спасибо большое!

-1

Решение

Стиль С (char *) строки используют концепцию нуль-терминатор. Это означает, что строки заканчиваются '\0' персонаж в их последнем элементе. Вы читаете ровно 4 символа в 4-символьном буфере, который не содержит нулевого символа для завершения строки. C и C ++ будут счастливо запускаться сразу после конца вашего буфера в поисках нулевого терминатора, который обозначает конец строки.

Быстрое решение заключается в создании блока length + 1читать в length данные, а затем установить str[length] = '\0', В вашем случае это будет так, как показано ниже.

char * memBlock = new char [5];
// populate memBlock with 4 characters
memBlock[ 4 ] = '\0';

Лучшее решение — использовать std::string вместо char * при работе со строками в C ++.

3

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

Вы также можете инициализировать буфер с нулями, помещая нулевые терминаторы в каждом месте.

char * memblock = new char [5](); // zeros, and one element longer

Хотя и неэффективно.

0

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