fread和fwrite结构体(菜鸟求教 fread 和 fwrite 怎么用啊)

本文目录
- 菜鸟求教 fread 和 fwrite 怎么用啊
- visual c++里怎么用fwrite和fread才能对学生数据库(结构体)既能输入数据又能读取数据
- fread和fwrite读取/写入结构体数据时,文件内部位置指针是怎么变化的
- 关于fwrite,fread的问题
菜鸟求教 fread 和 fwrite 怎么用啊
1.存储时是按照结构体大小存的话 你就可以直接按大小取出 例如
struct Date {
int Day;
int Month;
int Year;
};
struct Date *d1;
d1.Day=18;
d1.Month=4;
d1.Year=2011;
fwrite( d1,sizeof(Date), 1, fp); // fp是指向要保存到的文件的指针
struct Date *d2;
fread( d2, sizeof(Date), 1, fp); //读取
2、fread和fscanf的区别
#include 《stdio.h》
int fread( void *buffer, size_t size, size_t num, FILE *stream );
函数fread()读取个对象(每个对象大小为size(大小)指定的字节数),并把它们替换到由buffer(缓冲区)指定的数组. 数据来自给出的输入流. 函数的返回值是读取的内容数量...
int fscanf( FILE *stream, const char *format, ... );
函数fscanf()以scanf()的执行方式从给出的文件流中读取数据. fscanf()的返回值是事实上已赋值的变量的数,如果未进行任何分配时返回EOF.
3.fread的操作对象是根据你FILE fp=fopen();定义
FILE *fopen( const char *fname, const char *mode );
fopen()函数打开由fname(文件名)指定的文件, 并返回一个关联该文件的流.如果发生错误, fopen()返回NULL. mode(方式)是用于决定文件的用途(例如 用于输入,输出,等等)
Mode(方式) 意义
"r" 打开一个用于读取的文本文件
"w" 创建一个用于写入的文本文件
"a" 附加到一个文本文件
"rb" 打开一个用于读取的二进制文件
"wb" 创建一个用于写入的二进制文件
"ab" 附加到一个二进制文件
"r+" 打开一个用于读/写的文本文件
"w+" 创建一个用于读/写的文本文件
"a+" 打开一个用于读/写的文本文件
"rb+" 打开一个用于读/写的二进制文件
"wb+" 创建一个用于读/写的二进制文件
"ab+" 打开一个用于读/写的二进制文件
visual c++里怎么用fwrite和fread才能对学生数据库(结构体)既能输入数据又能读取数据
,fread和fwrite用于读写各种类型的数据块
第一个参数是读写数据的内存区的指针, 第2个是每一项的大小,第3个是项数, 第4个是文件指针.说简单点fwrite就是把结构体中的数据写入文件中,而fread就是从文件中把数据写入结构体中。
例如:结构体变量student
FILE *file;
fwirte(&student,sizeof(student),1,file)
表示向file文件中写入student所指的结构体中的一项。
fread(&student,sizeof(student),1,file);
表示将file中的内容读入student中。
#include 《stdio.h》
int main(void)
{
FILE *stream;
char msg = "this is a test";
char buf;
if ((stream = fopen("DUMMY.FIL", "w+")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
/* write some data to the file */
fwrite(msg, strlen(msg)+1, 1, stream);
/* seek to the beginning of the file */
fseek(stream, 0, SEEK_SET);
/* read the data and display it */
fread(buf, strlen(msg)+1, 1,stream);
printf("%s\n", buf);
fclose(stream);
return 0;
}
fread和fwrite读取/写入结构体数据时,文件内部位置指针是怎么变化的
结构体数据一般是在内存中紧挨着排列的,在写入结构体时,会整个结构一起写入,文件指针在写入完成后,是写入前后移结构体字节数,如果字节数不是4的倍数,在多数情况下会移动到4字节倍数位置,多出来的字节被跳过。
关于fwrite,fread的问题
写入文件中:
共写入三次,每次写入一个结构体的是8个字节,前4个字节是指针地址,后4个字节是一个int数据.
读文件件中:
//以下这一段有错误,
for(int i=0;i《nmemb;i++)
{
fread(&s,nmemb,sizeof(struct test),stream);
}
//以上这段有错误.
估计你是想分三次读出,那么应该是
for(int i=0;i《nmemb;i++)
{
fread(&s,sizeof(struct test),1,stream);
}
这样是读三次,每次读出一个结构体的数据8个字节,前4个为一个指针,后4个为一个int型数据
不过这样修改后仍然读不出期望的数据
(如果把读写文件合写为一个可以显示读出正确数据的假象)
这是因为,你存储的指针指向的地址是内存,而内存的数据是变化的,因此读不出期望的数据是很正常的.读出了正常的数据那可能是你的内存还没有被覆盖掉,这是假象,并不是程序正确.
可以把结构体中的char *name;修改为char name;
把写入文件中s.name="a";这样的赋值语句修改为:
strcpy(s.name,"a");
这样可以正确读出文件中保存的数据.
不知道这样修改后符不符合你的本意.

更多文章:
在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)
2026年10月11日 05:20
countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)
2026年10月11日 03:30
正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)
2026年10月11日 03:00
orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)
2026年10月10日 23:00
display的用法(display是什么意思 详解display的含义和用法)
2026年10月10日 22:00
html全部居中代码(怎么让网页居中显示,html如何让网页居中)
2026年10月10日 21:10




