-2

我做了一个程序如下

#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<fstream.h>
    void main() {
        char name[24];
        cout << "enter string :";
        gets(name);
        ofstream fout;
        fout.open("bin_data",ios::out|ios::binary);
        fout.write((char*)&name,10);
        fout.close();
    }

但是当我用记事本打开文件 bin_data 时,我发现字符串是以文本格式而不是二进制格式保存的......请帮助......

这段代码可以节省10个字符的单词。但是当我通过 turbo c++ v4.5 编译这段代码时,我发现了。当我输入 1 或 2 个字母的单词时,它以文本格式保存(忽略垃圾值),但是当我输入 3 到 7 个字母长的单词时,它以二进制格式保存。并以文本格式再次使用 9 和 10 字母单词.....谁能告诉我原因...? 请按照我上面提到的编译和运行程序并回答

4

1 回答 1

2

您的数据仅包含文本。它由文本格式和二进制格式的相同位表示。

二进制格式意味着您的数据被原封不动地写入文件。如果您要使用文本格式,一些非文本字符会被修改。例如,字节 10(表示换行符)可以更改为操作系统特定的换行符(Windows 上的两个字节,15 和 10)。

有关文本字符的二进制值,请参见http://www.asciitable.com/

您的第二个示例有缓冲区溢出

char name[24];
fout.write((char*)&name,10);

您保留 24 个字节的数据,这些数据由恰好位于该内存点的随机字节填充。当您将 2 个字符的字符串保存到缓冲区时,它只会覆盖前三个字节。第三个字节设置为值 0,它告诉您文本在该点结束。如果您要调用 strlen(),它会告诉您第一个 0 字节之前的字符数。

如果您的输入是 2 个字符的文本,并且您选择从缓冲区写入 10 个字节,则最后 7 个字节将被无效数据填充。请注意,这不会导致访问冲突,因为您保留了 24 个字节的数据。

另见:https ://en.wikipedia.org/wiki/Null-terminated_string

于 2015-11-10T07:55:59.787 回答