Я пытаюсь прочитать 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, а затем изменить обратно, без разницы.
Кто-нибудь знает, что здесь происходит и как мне это решить, пожалуйста? Спасибо большое!
Стиль С (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 ++.
Вы также можете инициализировать буфер с нулями, помещая нулевые терминаторы в каждом месте.
char * memblock = new char [5](); // zeros, and one element longer
Хотя и неэффективно.