fread读取结构体

wzuxian2012 2012-06-23 09:30:46
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );


这个函数, 的 第第2个参数是大小, 第三个是个数


1. 读取后一个结构后,如何解析????

struct MyStruct
{
int a;
char c;
};

如何解析???

2. 一个结构体存一行,会有换行,怎么处理
...全文
321 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-06-25
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
qq120848369 2012-06-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

1. 为什么不处理换行

2. fread与二级制有什么关系,难道其他方式打开不行吗??

还是说,不一定非要是二进制
[/Quote]

在WINDOWS平台, 请严格区分文件格式是二进制文件还是文本文件。
pathuang68 2012-06-23
  • 打赏
  • 举报
回复
wzuxian2012 2012-06-23
  • 打赏
  • 举报
回复
有人回答3楼的问题吗
wzuxian2012 2012-06-23
  • 打赏
  • 举报
回复
1. 为什么不处理换行

2. fread与二级制有什么关系,难道其他方式打开不行吗??

还是说,不一定非要是二进制
qq120848369 2012-06-23
  • 打赏
  • 举报
回复
malloc一块内存, 然后fread进去一个结构体, 就可以用了.
quwei197874 2012-06-23
  • 打赏
  • 举报
回复
#include <stdio.h>
#define SIZE 2
struct student_type
{
char name[10];
int num;
int age;
char addr[10];
}stud[SIZE];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu_list","wb"))==NULL)
{
printf("cant open the file");
exit(0);
}
for(i=0;i<SIZE;i++)
{
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
main()
{
int i;
for(i=0;i<SIZE;i++)
{
scanf("%s%d%d%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);
save();
}
for(i=0;i<SIZE;i++)
{
printf("%s,%d,%d",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
}

fread.c

#include <stdio.h>
#define SIZE 2
struct student_type
{
char name[10];
int num;
int age;
char addr[10];
}stud[SIZE];
void read()
{
FILE *fp;
int i;
if((fp=fopen("stu_list","rb"))==NULL)
{
printf("cant open the file");
exit(0);
}
for(i=0;i<SIZE;i++)
{
if(fread(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
main()
{

int i;
read();
for(i=0;i<SIZE;i++)
{
printf("%s,%d,%d,%s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
printf("\n");
}
}

资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在编程中,经常需要将内存中的数据保存到文件中以便后续使用或传输。对于结构体(Struct)这类复杂数据类型,通常会以二进制格式存储,因为二进制文件占用空间小且读写速度快。本文将详细介绍如何在 C/C++ 等编程语言中实现“将结构体写入二进制文件”以及“从二进制文件中读取结构体数据”。 结构体是一种由多个不同类型的成员组成的复合数据类型,可以包含整型、浮点型、字符型等基本类型。在二进制文件中,结构体会按照其在内存中的布局顺序,逐个将每个成员的字节序列写入文件,从而保持结构体数据的完整性。 fopen():用于打开文件,创建或访问文件。需要指定文件名和访问模式,例如“wb”表示以二进制模式写入文件。 fwrite():用于将数据写入文件。它接受一个指针、要写入的元素个数、元素大小和文件指针作为参数。 fread():用于从文件中读取数据,与fwrite()类似,但用于读取操作。 fclose():用于关闭文件,释放系统资源。 以下是一个示例代码,展示如何将一个包含整型和字符串的结构体写入二进制文件: 从二进制文件中读取结构体时,必须确保读取的数据量与写入时一致,否则可能会导致数据损坏。以下是如何从二进制文件读取结构体的示例: 文件操作时需要处理异常情况,例如文件打开失败、写入或读取错误等。 在跨平台操作时,需要注意不同操作系统对二进制文件的字节序(大端或小端)处理可能存在差异。 结构体中的成员可能会有填充字节,以确保对齐。因此,从二进制文件中读取结构体可能与原始结构体不完全匹配。为了避免这种情况,可以使用__attribute__((packed))(在 GCC 等编译器中)来去除填充。 通过使用标准 I/O 库中的函数,我们可以方便地将结构体数据写入二进制文件,并在需要时读取。这种方法

70,034

社区成员

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

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