我正在尝试从文件中的特定位置读取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改为多字节,然后改回来,没有区别。
有谁知道这里发生了什么,我该如何解决?非常感谢!
答案 0 :(得分:3)
C样式(char *
)字符串使用null-terminators的概念。这意味着字符串在其最后一个元素中以'\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 *
。
答案 1 :(得分:0)
您还可以使用零初始化缓冲区,在每个位置放置空终止符。
char * memblock = new char [5](); // zeros, and one element longer
虽然效率相当低。