尝试从fstream抓取char *时的奇怪字符

时间:2014-10-30 05:00:01

标签: c++ string fstream null-terminated

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

enter image description here

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

2 个答案:

答案 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

虽然效率相当低。