-1

我正在尝试从文件中的特定位置读取 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 更改为多字节,然后再改回来,没有区别。

在此处输入图像描述

有谁知道这里发生了什么,我该如何解决?非常感谢!

4

2 回答 2

3

C 风格 ( 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';

更好的解决方案是在使用C++ 中的字符串时使用std::string,而不是使用。char *

于 2014-10-30T05:02:49.130 回答
0

您还可以用零初始化缓冲区,在每个位置放置空终止符。

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

虽然相当低效。

于 2014-10-30T05:17:38.870 回答