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、文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄露和在下次访问文件时出现问题。