我制作了如下程序
localhost:3000
但是当我用记事本打开文件bin_data时,我发现字符串是以文本格式保存而不是二进制形式......请帮助......
此代码可以保存10个字的单词。 但是当我通过turbo c ++ v4.5编译这段代码时,我发现了这一点。当我输入1或2个字母单词时,它以文本格式保存(忽略垃圾值)但是当我输入3到7个字母长的单词时,它以二进制格式保存。再以9和10字母的单词再次以文本格式.....任何人都可以告诉我原因......? 请按照我的说法编译并运行程序并回答
答案 0 :(得分:2)
您的数据仅包含文字。它由文本格式和二进制格式的相同位表示。
二进制格式意味着您的数据将不变地写入文件。如果您使用文本格式,则会修改一些非文本字符。例如,字节10(表示换行符)可以更改为特定于操作系统的换行符(Windows上的两个字节,15和10)。
有关文本字符的二进制值,请参阅http://www.asciitable.com/
您的第二个示例有buffer overflow。
char name[24];
fout.write((char*)&name,10);
您保留24个字节的数据,这些数据由恰好位于该内存点的随机字节填充。将2个字符的字符串保存到缓冲区时,它只会覆盖前三个字节。第三个字节设置为值0,它告诉您文本在该点结束。如果你要调用strlen(),它会告诉你前0字节前的字符数。
如果您的输入是2个字符的文本,并且您选择从缓冲区写入10个字节,则最后的7个字节将填充无效数据。请注意,这不会导致访问冲突,因为您已保留24个字节的数据。