我正在编写一个简单的程序,写入二进制文件,关闭它然后读取刚刚写入的数据。我正在尝试编写一个无符号字符数组。我在阅读数据时遇到了一些问题。我不确定我是在写不正确的数据还是读错了。当我读取数据时,我的输出为: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";
答案 0 :(得分:7)
作为输出看到的是array
Typecast unsigned char
至int
这将给出预期的输出。
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])<<" ";