2013-02-05 57 views
0

我有一个程序,读取包含列表的.dat文件:读取字符显示所有的字符,随后一些垃圾字符

removepeer 452 
addpeer 6576 
removepeer 54245 

在某些时候,它读出垃圾文字:H

这里是我的代码的一部分,我发现故障:

getline(abc, info, '\n'); //data here displays pretty fine 

int count = info.size(); 

char text[count]; 

for(int a=0; a<count; a++){ 
    text[a] = data[a]; 
} 
cout << text << endl; //Some rubbish text found in some printout! 

它打印出的最后一行其次是一些垃圾文字

+0

问题几乎可以肯定是一个没有终止的字符串,但是什么是'数据'?数据[a]'保证在该对象的范围之内吗?为什么不直接打印'info'? –

回答

4

text数组不会被空终止,这在使用operator<<char[]时是必需的,因为它们被视为空终止的c样式字符串。内存中的随机字符将被写入,直到偶然找到空终止符。从技术上讲,超出数组边界的访问是未定义的行为。

要更正,请将空终止符附加到text。当你的编译器作为一个扩展变长数组(这不是标准C++,但在C99),你可以将其更改为:

char text[count + 1]; 

// snip... 

text[count] = 0; 

话虽如此,我不清楚为什么你从std::string复制实例为char[]std::string实例也可以使用operator<<写入流。

+0

是的,VLA是一个C99功能。一些C++编译器支持它们作为扩展。 –

+0

@JonathanWakely,欢呼声。 – hmjd