5

我正在编写一个简单的程序,它写入一个二进制文件,关闭它,然后读取刚刚写入的数据。我正在尝试编写一组无符号字符。我在读取数据时遇到了一些问题。我不确定我是在不正确地写入数据还是读取错误。当我读取数据时,我得到的输出为:5 bytes读取的字节数,但我得到的输出与我写入文件的值不同。

FILE *binFile = fopen("sample","wb");

unsigned char data[5]={5,10,15,20,25};
fwrite(data,sizeof(unsigned char),sizeof(data),binFile);
fclose(binFile);

unsigned char data2[5];
binFile = fopen("sample","rb");
int s = fread(data2,1,sizeof(data),binFile);
fclose(binFile);
cout<<s<<" bytes\n";
for(int i=0; i<5;i++)
        cout<<data2[i]<<" ";
cout<<"\n";
4

4 回答 4

7

您收到的输出看到的是元素的 ASCII 字符array

类型转换unsigned charint

这将给出预期的输出。

for(int i=0; i<5;i++)
        cout<<(int)data2[i]<<" ";
于 2013-07-26T08:21:52.453 回答
3

当您打印ASCII - 5,10,15,20,25等不可打印字符时,您看到的是有效且正常的行为。当它们被打印为字符时,它看起来会有所不同。因此,您可以尝试使用强制转换为 int,也可以尝试使用可打印字符 (char) ,如A、B、C、D、E

您的代码可以按预期运行,

1)分配可打印字符,

    unsigned char data[5]={'A','B','C','D','E'};

或者

2)将输出转换为int

    for(int i=0; i<5;i++)
       cout<< (int) data2[i]<<" ";
于 2013-07-26T08:24:34.250 回答
2

我猜你得到了一些像“俱乐部标志”这样的字符的输出,然后在下一行你看到了另外 3 个字符,对吧?

如果查看 ASCII 表,则 ASCII 5、10、15、20 和 25 与屏幕上显示的相同。ASCII 10 是 '\n' 字符,因此数组中的第二个字符会在第二行打印输出:)

于 2013-07-26T08:46:29.690 回答
1

Sizeofdata是 5 并且sizeof (unsigned char)总是 1 因此你写了 5 个字节。检查返回fwrite(读取或写入的项目数)。您还读取了 5 个字节,因此fread将返回 5。

根据 C99 第 6.5.3.4 节第 3 段和 C11 第 6.5.3.4 节第 4 段

当应用于具有 char、unsigned char 或 signed char 类型(或其限定版本)的操作数时,结果为 1。当应用于具有数组类型的操作数时,结果是数组中的总字节数. 88) 当应用于具有结构或联合类型的操作数时,结果是此类对象中的总字节数,包括内部和尾随填充。

另一方面,您正在打印的任何内容都不会显示,因为您正在打印的数字范围是不可打印的 ASCII 范围。分配高于 32 的东西或从 65 开始一些东西以查看结果。或者简单地使用“A”、“b”等进行初始化。

或使用现有代码,将类型转换打印为 intcout<<int (data2[i])<<" ";

于 2013-07-26T08:20:41.513 回答