c语言文件操作fwrite和fread
发布时间:2025-05-12 09:36:30 发布人:远客网络
一、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、由于一般并不推荐自定义头文件名与系统头文件名相同(容易引起歧义并难以维护),所以先后顺序并不是太重要,尤其在硬件速度越来越快的今天,使用哪种符号引用头文件已经差别很小了。