您当前的位置:首页 > 互联网教程

c语言文件操作fwrite和fread

发布时间:2025-05-12 09:36:30    发布人:远客网络

c语言文件操作fwrite和fread

一、c语言文件操作fwrite和fread

fread是C语言标准为中的一个函数。它从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。

fwrite是C语言标准库中的一个函数,指向文件写入一个数据块。示例如下:

size_tresult;//返回值是读取的内容数量

pFile=fopen("myfile.bin","rb");

if(pFile==NULL){fputs("Fileerror",stderr);exit(1);}//如果文件错误,退出1

fseek(pFile,0,SEEK_END);//指针移到文件末位

lSize=ftell(pFile);//获得文件长度

rewind(pFile);//函数rewind()把文件指针移到由stream(流)指定的开始处,同时清除和流相关的错误和EOF标记

buffer=(char*)malloc(sizeof(char)*lSize);//分配缓冲区,按前面的lSize

if(buffer==NULL){fputs("Memoryerror",stderr);exit(2);}//内存分配错误,退出2

result=fread(buffer,1,lSize,pFile);//返回值是读取的内容数量

if(result!=lSize){fputs("Readingerror",stderr);exit(3);}//返回值如果不和文件大小,读错误

pFile=fopen("myfile.bin","wb");//打开文件写操作

fwrite(buffer,1,sizeof(buffer),pFile);//把浮点数组写到文件myfile.bin

pFile=fopen("myfile.bin","rb");//重新打开文件读操作

fread(read,1,sizeof(read),pFile);//从文件中读数据

printf("%f\t%f\t%f\n",read[0],read[1],read[2]);

二、FILE **file

FILE是在stdio.h定义的保存文件流信息的一个结构体类型(也可能是在其它文件中定义了另外的数据类型,然后通过typedef定义FILE)。注意它本身是类型而不是结构体名,所以FILE类型在字面上虽然不包含struct,但实际表示一个结构体。FILE变量中保存的不止是文件路径,还有缓冲区指针、读写方式等一系列信息(具体实现不一定相同)。一般使用FILE*类型变量表示文件句柄,通过它来访问FILE结构体,对文件进行操作。FILE**是指向FILE*的指针。

现在考虑定义一个基类型为FILE*的数组,那么它的数组名就是const FILE**类型的地址常量(经过传递后退化成FILE**指针):

成功的话file[1]就是一个有效的文件指针。

file=malloc(100*sizeof(FILE*));

接下来这里file的使用和上面相同(当然,使用完后需要free以免内存泄露),区别仅在于file是动态数组,指向的若干FILE*变量在堆上而不是栈上。

三、c语言中文件怎样调用文件

1、扩展名为.h的文件,在C语言中被称为header file,也就是头文件。

2、头文件的数据格式就是普通的文本文件,可以通过新建文本文件(txt),再把扩展名改为.h的方式创建,在此不赘述。

3、头文件内容并没有固定的格式要求,不过一般为防止嵌套引用给编译器带来死锁或者没必要的开销,一般约定整个头文件中所有内容在一个条件编译下,即如下格式:

4、这样可以保证一个头文件在一个源文件中最多只被引用一次。为避免宏名重复,宏名一般由头文件名转换而来,如果头文件名是xxx.h,那么宏名一般定义为:

5、即前后各加一个下划线,同时文件名中除数字、字母、下划线以外的字符均转换为下划线(_)。

6、头文件主体中内容同样没有做强制约定,可以出现在源文件(.c)中的任何代码均可以放在头文件中。不过一般情况下可以包括以下几种内容:

7、二者区别在介绍头文件引用时再详细介绍。

8、typedef unsigned long U32;//为了简写而给无符号32位整型定义一个新的名字

9、也可以是enum, union等复杂类型。

10、6如果有一个静态全局变量需要在不同源文件中使用,但各文件之间互不相关。那么可以放在头文件中。如:

11、7对于支持C99规范的C编译器,还可以把内联函数定义在头文件中。比如

12、static inline int get_min(int a, int b)

13、以上是常见的头文件中的元素。但实际上头文件中也可以放全局变量的定义,全局函数的实现等。但是头文件中一旦定义了这样的元素,这个头文件在一个工程中只能被一个文件引用,否则编译器会报重复定义的错误。

14、比如如果有一个规模很大的常量数组,比如一副图片的二进制值,如果把它定义在源文件中,就会显得很冗余,因为并不会经常修改。这时可以定义在头文件中,只在一个源文件中引用,当有多幅图片需要随时更换时,也可以通过简单的在源文件中修改引用的头文件名达到修改的目的。

15、头文件引用的方法其实之前已经大致说过了,在源文件中引用头文件和在头文件中引用的格式是一样的:

16、用<>和""是有一定的区别的。在编译器查找头文件的时候,会在两个区域分别查找。

17、一个是系统头文件区域,即类似于stdio.h一类的C库函数头文件区。

18、另一个是自定义头文件区,比如当前目录,以及其它自定义的目录。

19、用<>时,编译器会先在系统区域查找,然后再查找自定义区域。而用""时则相反。

20、由于一般并不推荐自定义头文件名与系统头文件名相同(容易引起歧义并难以维护),所以先后顺序并不是太重要,尤其在硬件速度越来越快的今天,使用哪种符号引用头文件已经差别很小了。