fwrit函数是一个常用的文件写函数,这个函数比较重要。此处暂时写一下他的一些相关信息,以便给读者提供帮助,成长。
fwrite函数原型:
size_t fwrite(const void* buffer,size_t size, size_t count, FILE* stream);
功能:
向文件中写入一个数据块。(写入的数据不限于文本格式,也可以是二进制文件等)
返回值:返回实际写入的数据块数。
参数:
1) buffer是一个指针。对fwrite来说是要写入数据的地址。
2) size是要写入内容的单字节数。
3) count是要
进行写入size字节的数据项的个数。
4)
stream为目标文件指针
5)
返回实际写入的数据项个数count。
说明:写入到文件的哪里? 这个与文件的打开模式有关,如果是w+,则是从filepointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大。
fseek对此函数有作用,但是fwrite[1]函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE*fp)函数同步。
注意:假如定义buffer缓冲区的大小为1024且第二个参数为1时,那么fread的第三个参数一定要小于等于1024,否则会出现错误。或许大家在学的时候记得比较清楚,实际编程中有可能会忘记。再次特别说明。
关于fwrite第3个参数count解释:
fwrite(const void*buffer,size_t size,size_tcount,FILE*stream);
可以这样理解,将缓冲区buffer的内容写入stream指向的文件
共写count组数据,每组数据有size个字节,
如果有一个结构体
struct AAA
{
char a;
int b;
long c;
float d
};
struct AAA x,y[20];
那么写这个数据到文件就是:
fwrite(x,sizeof(AAA),1,fp);
fwrite(y,sizeof(AAA),20,fp);
当然,因为地址是连续的,你也可以
fwrite(y,sizeof(AAA)*20,1,fp);或者
fwrite(y,1,sizeof(AAA)*20,fp);
这样很别扭
而且第二个参数size的大小是有限制的,
所以最好是用
fwrite(y,sizeof(AAA),20,fp);
来得可靠,安全,方便,清楚
示例代码:
1. #include
2. #include
3.
4. #define FILENAME ("/home/snail/work_dir/linux_c_work/file.bin")
5. #define BUF ("Hello world!\n")
6.
7. int main()
8. {
9. FILE *fp = NULL;
10. int write_length = 0;
11. fp = fopen(FILENAME, "ab+");
12. if(fp == NULL)
13. {
14. return 0;
15. }
16. write_length = fwrite(BUF, 1, strlen(BUF), fp);
17. printf("write_length = %d\n", write_length);
18. fclose(fp);
19. fp = NULL;
20. return 0;
21. }
在文件操作时,需要注意以下几点问题
1、在定义文件指针时,要将文件指针指向空;如 FILE *fp = NULL;
2、文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄露和在下次访问文件时出现问题。