编写和读取无符号字符到二进制文件

时间:2013-07-26 08:14:02

标签: c++ c file-io fwrite fread

我正在编写一个简单的程序,写入二进制文件,关闭它然后读取刚刚写入的数据。我正在尝试编写一个无符号字符数组。我在阅读数据时遇到了一些问题。我不确定我是在写不正确的数据还是读错了。当我读取数据时,我的输出为: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 个答案:

答案 0 :(得分:7)

作为输出看到的是array

元素的ASCII字符

Typecast unsigned charint

这将给出预期的输出。

for(int i=0; i<5;i++)
        cout<<(int)data2[i]<<" ";

答案 1 :(得分:3)

当您打印 ASCII - 5,10,15,20,25 等不可打印的字符时,您看到的是有效和正常的行为。当它们作为字符打印时看起来不同。因此,您可以尝试使用强制转换为int,也可以尝试使用可打印的字符(字符),例如 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]<<" ";

答案 2 :(得分:2)

我猜你的输出有一些字符,如'俱乐部的标志'然后在下一行,你会看到其他3个字符,对吗?

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

答案 3 :(得分:1)

Sizeof data为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或者类型的操作数时   签名字符,(或其合格版本),结果为1. 何时   应用于具有数组类型的操作数,结果为总数   数组中的字节数。 88)当应用于具有的操作数时   结构或联合类型,结果是总的字节数   这样的对象,包括内部和尾部填充。

另一方面,无论您打印的是什么,都不会显示,因为您打印的数字范围是不可打印的ASCII范围。分配高于32的东西或从65开始查看结果。或者只是使用'A','b'等初始化

在将类型转换打印到int cout<<int (data2[i])<<" ";

时,使用现有代码