C读取二进制文件的问题

kevin202121 2011-06-17 12:59:24
生成了二进制文件,如何利用C实现读这个二进制文件,并将其内容print出来,看看和写的信息是否一致。
使用fread函数吗?望君指点。
...全文
198 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevin202121 2011-06-20
  • 打赏
  • 举报
回复
结构修改下,ip 应该是 unsigned int 值,不是指针
typedef struct recv_data
{
uint32_t ip;
uint16_t port;
void *ptr;

uint16_t data_size;
char buff[4096];

} recv_data_t;
代码该怎么改?
AnYidan 2011-06-18
  • 打赏
  • 举报
回复
当然可以,c 中所有的文件操作都可以操作 txt 和 binary 文件,函数的具体使用网上有
一只牛_007 2011-06-18
  • 打赏
  • 举报
回复
read也行
一只牛_007 2011-06-18
  • 打赏
  • 举报
回复
fread就行了吧
studiovc 2011-06-18
  • 打赏
  • 举报
回复
typedef struct recv_data
{
unsigned int *ip;
unsigned short port; //socket port
void *ptr;
unsigned short data_size;
char *buff;
} rbuff;
fp=open("wf.dat",0)
read(fp,rbuff,sizeof(rbuff));
printf("ip=%s",rbuff.ip);
printf("buff=%s",rbuff.buff);
//......继续输出其他字段
reckhou 2011-06-17
  • 打赏
  • 举报
回复
fp = fopen("wf.dat","rb");

rb改成rb+试试看

kevin202121 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 q191201771 的回复:]
引用 6 楼 kevin202121 的回复:
引用 5 楼 q191201771 的回复:
你这里是把结构体内的元素一个一个写入文件的
你用fread再一个一个读出来就行了
记得用"rb" 二进制形式打开文件读


用fread读出来后,直接printf就可以吗?
可以的~~
[/Quote]

二进制文件内容应包括如下:
192.168.100.1 test message, 1234567890! 9876
可是我把代码改完后,只输出了IP地址和端口号,其他的信息没有输出,而输出的是9876及774910001。是什么原因?
代码有什么问题吗,如下所示:
fp = fopen("wf.dat","rb");

fread (&data,sizeof(data.buff),1,fp);
printf("%s\n",data.buff);
fread (&data,sizeof(data.data_size),1,fp);
printf("%d\n",data.data_size);
fread (&data,sizeof(data.port),1,fp);
printf("%d\n",data.port);
fread (&data,sizeof(data.ip),1,fp);
printf("%d\n",data.ip);

fclose(fp);
赵4老师 2011-06-17
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看文件原始字节内容。
wangsifu2009 2011-06-17
  • 打赏
  • 举报
回复
hoho~~~
就想叫yoko 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kevin202121 的回复:]
引用 5 楼 q191201771 的回复:
你这里是把结构体内的元素一个一个写入文件的
你用fread再一个一个读出来就行了
记得用"rb" 二进制形式打开文件读


用fread读出来后,直接printf就可以吗?
[/Quote]可以的~~
kevin202121 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 q191201771 的回复:]
你这里是把结构体内的元素一个一个写入文件的
你用fread再一个一个读出来就行了
记得用"rb" 二进制形式打开文件读
[/Quote]

用fread读出来后,直接printf就可以吗?
就想叫yoko 2011-06-17
  • 打赏
  • 举报
回复
你这里是把结构体内的元素一个一个写入文件的
你用fread再一个一个读出来就行了
记得用"rb" 二进制形式打开文件读
kevin202121 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 q191201771 的回复:]
你把你写文件的代码贴出来~~

fread可以读的 也可以通过其他函数读
[/Quote]
改怎么读,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct recv_data
{
unsigned int *ip;
unsigned short port; //socket port
void *ptr;
unsigned short data_size;
char *buff;
} recv_data_t;

int main (int argc, char **argv)
{
FILE *fp;
recv_data_t data;

memset(&data, 0, sizeof(data));

data.ip=(unsigned int *) malloc (sizeof(unsigned int) *sizeof("192.168.100.1"));
memcpy(data.ip,"192.168.100.1",sizeof("192.168.100.1"));
data.port = 9876;
data.data_size=strlen("text message, 1234567890!");
data.buff=(char *) malloc (4096 *sizeof(char));
strcpy(data.buff, "test message, 1234567890!");
data.data_size = strlen(data.buff);
data.ptr = NULL;

fp = fopen ("wf.dat", "wb");
if (fp == NULL)
{
printf ("open file fail\n");
return -1;
}

fwrite (data.ip,data.data_size,1,fp);
fwrite (&(data.port), sizeof(data.port), 1, fp);
fwrite (&(data.data_size), sizeof(data.data_size), 1, fp);
fwrite (data.buff, data.data_size, 1, fp);
fclose(fp);
free(data.buff);
return 0;
}

bdmh 2011-06-17
  • 打赏
  • 举报
回复
fread可以
fengzhw 2011-06-17
  • 打赏
  • 举报
回复
简单些可以用fgetc,逐个打印成16进制,每20个字节换行.
用fread你要考虑末尾读入的块可能字节不够,不过用来调试也没啥.
就想叫yoko 2011-06-17
  • 打赏
  • 举报
回复
你把你写文件的代码贴出来~~

fread可以读的 也可以通过其他函数读

69,382

社区成员

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

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