关于fwrite和fread的问题。

Zijian_Zhang 2011-08-02 05:05:13
弱弱的问一下:
1、在WINDOWS下编译且执行的程序,若某数据块用fwrite写入到文件,然后用Linux系统下的程序,用fread读取,所得的数据块是否仍然一样?(同一硬件架构)

2、若用x86操作系统架构编译执行的程序,将某数据块写入到文件,若用x64的操作系统读取,数据块是否一样?

3、若硬件不同,是否有这样不同?(我记得不同硬件储存数据的方式是不同的,如内存里的数据)
...全文
235 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zijian_Zhang 2011-08-02
  • 打赏
  • 举报
回复
谢谢大家了!明白了,主要是多字节数据储存问题。准备结贴。
icansaymyabc 2011-08-02
  • 打赏
  • 举报
回复

举例:


//在sun CPU 上:

int i= ...;
char * p= (char *)& i;

fwrite(... p ...);

//在 intel CPU 上

char buf[...];
fread(... buf ...);
int i= *((int *)buf);

//这种用法一定出错,读出来的整数值和写入的整数值不一样;




//在sun CPU 上:


char buf[...];
buf[x]=x;
fwrite(... buf ...);

//在 intel CPU 上

char buf[...];
fread(... buf ...);
x=buf[x]

//这种用法绝对没问题,任何机器上保证一致;



jackyjkchen 2011-08-02
  • 打赏
  • 举报
回复
这是某密码学库中,将平台相关的整数转成字节序列的宏


#define STORE32L(x, y) \
{ (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
(y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }

#define LOAD32L(x, y) \
{ x = ((ulong32)((y)[3] & 255)<<24) | \
((ulong32)((y)[2] & 255)<<16) | \
((ulong32)((y)[1] & 255)<<8) | \
((ulong32)((y)[0] & 255)); }

#define STORE64L(x, y) \
{ (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
(y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
(y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
(y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }

#define LOAD64L(x, y) \
{ x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
(((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
(((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
(((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }

#define STORE32H(x, y) \
{ (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
(y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }

#define LOAD32H(x, y) \
{ x = ((ulong32)((y)[0] & 255)<<24) | \
((ulong32)((y)[1] & 255)<<16) | \
((ulong32)((y)[2] & 255)<<8) | \
((ulong32)((y)[3] & 255)); }

#define STORE64H(x, y) \
{ (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
(y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
(y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
(y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }

#define LOAD64H(x, y) \
{ x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
(((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
(((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
(((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }

至善者善之敌 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gingzai777 的回复:]
引用 3 楼 jackyjkchen 的回复:

引用 2 楼 icemornings 的回复:

fwrite()是按字节数写入文件的吧,单字节又不是多字节,不会有字节序问题吧。
fread()同理……
---------------------
纯属个人理解……

关于字节序的问题,只有在大于一字节的数据才会出现,比如int型,内存中数据就有大小端之分。

所以,楼主如果……
[/Quote]

恩,主要还是大小端格式的问题,可以定义宏具体处理

看这里http://bbs.hc3i.cn/archiver/tid-6366.html
缺媳妇的郝 2011-08-02
  • 打赏
  • 举报
回复
不会,关注
Zijian_Zhang 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jackyjkchen 的回复:]

引用 2 楼 icemornings 的回复:

fwrite()是按字节数写入文件的吧,单字节又不是多字节,不会有字节序问题吧。
fread()同理……
---------------------
纯属个人理解……

关于字节序的问题,只有在大于一字节的数据才会出现,比如int型,内存中数据就有大小端之分。

所以,楼主如果要处理这种多字节整数,必须在写文件之前把它格式化成统……
[/Quote]

谢谢,但如何统一成同一格式??我的程序就是有一个long int类型(4个字节),sizeof这个我已经考虑到了的。
jackyjkchen 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 icemornings 的回复:]

fwrite()是按字节数写入文件的吧,单字节又不是多字节,不会有字节序问题吧。
fread()同理……
---------------------
纯属个人理解……
[/Quote]
关于字节序的问题,只有在大于一字节的数据才会出现,比如int型,内存中数据就有大小端之分。

所以,楼主如果要处理这种多字节整数,必须在写文件之前把它格式化成统一的形式,大端或者小端
icemornings 2011-08-02
  • 打赏
  • 举报
回复
fwrite()是按字节数写入文件的吧,单字节又不是多字节,不会有字节序问题吧。
fread()同理……
---------------------
纯属个人理解……
jackyjkchen 2011-08-02
  • 打赏
  • 举报
回复
fread和fwrite是二进制读写,你如果能保证不同系统或架构下参数是兼容的(比如指定数据长度的时候用绝对值,别用平台相关的sizeof),就绝对没问题。

给你提个建议。

fopen用二进制方式打开
严格只使用fread、fwrite做IO,绝对不要用fgets等字符串函数
缓冲区严格使用字节组unsigned char *,读写长度用绝对值

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧