C语言 文件操作的头文件

计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流。在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作,C语言规定该文件指针类型为FILE型。文件的信息有这个FILE型的结构体来进行定义。

FILE的结构体的定义如下

typedef struct
{short level;            // 缓冲区“满”或“空”的程度unsigned flags;         // 文件状态标志char fd;                // 文件描述符unsigned char hold;     // 如缓冲区无内容不读取字符short bsize;            // 缓冲区的大小unsigned char *buffer;  // 数据缓冲区的位置unsigned ar *curp;      // 指针当前的指向unsigned istemp;        // 临时文件指示器short token;            // 用于有效性检查
}FILE;

例如我们定义一个文件指针:FILE *fp;    fp指向某一个文件的文件信息区(是一个结构体变量),通过该文件信息区就能够访问该文件。如下图所示:

文件缓冲区:缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘中去。

文件的打开(fopen函数)

函数调用:

FILE *fp;

fp = fopen(文件名,使用文件方式);

注意:

需要打开的文件名,也就是准备访问的文件的名字

使用文件的方式(“读”还是“写”等);

让哪一个指针变量指向被打开的文件。

文件使用方式    

 含   义

-------------------------------------------------------------------------------------

“r” (只读)为输入打开一个文本文件

“w” (只写)为输出打开一个文本文件

“a” (追加)向文本文件尾增加数据(以ascll码的形式追加)

“rb” (只读)为输入打开一个二进制文件

“wb” (只写)为输出打开一个二进制文件

"ab“ (追加)向二进制文件尾增加数据(以二进制的形式追加)

"r+“ (读写)为读/写打开一个文本文件

"w+” (读写)为读/写建立一个新的文本文件

"a+” (读写)为读/写打开一个文本文件

"rb+“ (读写)为读/写打开一个二进制文件

“wb+“ (读写)为读/写建立一个新的二进制文件

“ab+” (读写)为读/写打开一个二进制文件

-------------------------------------------------------------------------------------

几点注意:

凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。

文件若不存在发生错误。

用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。

若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。但此时该文件必须是存在的,否则将会出错。

在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。

在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。

把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。

fclose 函数说明:

作用:关闭一个文件流,释放文件指针

格式:int fclose( FILE *fp );

返回值:如果流成功关闭,fclose 返回 0,否则返回EOF

参数说明:

*fp:需要关闭的文件指针

注:在文件操作完成后我们应该调用该函数来关闭文件,如果不关闭文件将可能会丢失数据。因为在向文件写入数据时会先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。

三、顺序读写数据文件

fgetc 函数说明:

作用:从文件指针指向的文件流中读取一个字符,读取一个字节后,光标位置后移一个字节

格式:int fgetc(FILE *stream);

返回值:返回所读取的一个字节,如果读到文件末尾或者读取出错时返回EOF(EOF是文件结束标识符,一般值为-1)

参数说明:

*stream:文件指针,从该文件指针指向的文件中读取一个字符,然后将光标后移一个字节

fputc 函数说明:

作用:将指定字符写到文件指针所指向的文件的当前写指针位置上

格式:int fputc (char c, File *fp);

返回值:在正常调用情况下,函数返回写入文件的字符的ASCII码值,出错时,返回EOF

参数说明:

c:需要写入的字符

*fp:文件指针,在当前文件指针所指向的文件的当前写指针位置上写入一个字符c,然后文件内部写指针会自动后移一个字节位置

fgets 函数说明:

作用:从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。

格式:char *fgets(char *buf, int bufsize, FILE *stream);

返回值:函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

参数说明:

*buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明存储数据的大小。

*stream: 文件指针,将要读取的文件流。

fputs 函数说明:

作用:向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)

格式:int fputs(char *str, FILE *fp);

返回值:若成功返回0,失败返回EOF

参数说明:

*str: 需要写入的字符串

*fp: 文件指针,将要写入的文件流

fprintf 函数说明:

作用:格式化后输出到文件中

格式:int fprintf (FILE*  stream, const char*  format, [argument]);

返回值:若成功返回值是输出的字符数,当发生错误时返回一个负值

参数说明:

*stream:文件指针

*format:输出格式

[argument]:附加参数列表

注:用法与printf函数类似,这里只是参数多了一个文件指针,将格式后的结果输出到文件中

fscanf 函数说明:

作用:从一个流中执行格式化输入

格式:int fscanf(FILE* stream,constchar* format,[argument]);

返回值:成功返回读入的参数的个数,失败返回EOF。

参数说明:

*stream:文件指针

*format:格式字符串

[argument]:输入列表

注:用法与scanf函数类似

fread 函数说明:

作用:从一个文件流中读数据,最多读取count个元素,每个元素size字节

格式:size_t fread ( void *buffer, size_t  size, size_t  count, FILE *stream) ;

返回值:如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回0

参数说明:

*buffer:用于接收数据的内存地址

size:要读的每个数据项的字节数,单位是字节

count:要读count个数据项,每个数据项size个字节

*stream:文件指针
注:这个函数以二进制形式对文件进行操作,不局限于文本文件

fwrite 函数说明:

作用:向文件写入一个数据块

格式:size_t fwrite(const void* buffer, size_t  size, size_t  count, FILE* stream);

返回值:返回实际写入的数据块数目

参数说明:

*buffer:待写入的数据的内存地址

size:要写入内容的单字节数

count:要进行写入size字节的数据项的个数

*stream:文件指针

注:这个函数以二进制形式对文件进行操作,不局限于文本文件

四、随机读写数据文件

rewind 函数说明:

作用:将文件内部的位置指针重新指向一个流(数据流/文件)的开头

格式:void rewind(FILE *stream);

返回值:无

参数说明:

*stream:文件指针

ftell 函数说明:

作用:得到文件位置指针当前位置相对于文件首的偏移字节数(测定文件位置标记的当前位置)

格式:long ftell(FILE *stream);

返回值:成功返回当前文件位置,失败返回-1L

参数说明:

*stream:文件指针

注:因为ftell返回long型,根据long型的取值范围-2^31~2^31-1(-2147483648~2147483647),故对大于2.1G的文件进行操作时出错。

fseek 函数说明:

作用:重定位流(数据流/文件)上的文件内部位置指针

格式:int fseek(FILE *stream, long offset, int origin);

返回值:成功返回0,失败返回非0值

参数说明:

*stream:文件指针

offset:偏移量,正数表示正向偏移,负数表示负向偏移。因为是long型数据,所以应在数字后面加一个字母L

origin:设定从文件的哪里开始偏移,可取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET,详见下表:

名字 起始点 用数字代表
SEEK_SET 文件开始位置 0
SEEK_CUR 文件当前位置 1
SEEK_END  文件末尾位置 2

示例:

fseek(fp,100L,0);     // 把位置指针移动到离文件开头100字节处
fseek(fp,100L,1);     // 把位置指针移动到离文件当前位置100字节处
fseek(fp,-100L,2);    // 把位置指针退回到离文件结尾100字节处

五、文件读写的出错检测

ferror 函数说明:

作用:在调用各种输入输出函数(如 putc、getc、fread、fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查

格式:int ferror(FILE *stream);

返回值:返回0表示未出错,返回非0值表示出错

参数说明:

*stream:文件指针

clearerr 函数说明:

作用:使文件错误标志和文件结束标志置为0。假设在调用一个输入输出函数时出现了错误,ferror函数值为一个非零值。在调用clearerr(fp)后,ferror(fp)的值变为0。只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。

格式:void clearerr(FILE *stream);

返回值:无

参数说明:

*stream:文件指针

六、实例:读取文件A的内容输出到屏幕上并写入到文件B中

1、我们先在D盘下新建一个文本文档(文件名为:A.txt)文件,并在该文件里面写入任意字符,如果没有此文件会因为找不到文件而造成文件打开失败。

2、编译源代码并运行程序,程序会将文件("A.txt")里面的字符逐个读取输出到屏幕上,并且会在D盘新建一个"B.txt"文件,其内容与"A.txt"文件相同

3、若打开文件失败,则如下图所示,此时应检查文件路径是否正确(检查D盘下是否存在"D:\\A.txt"文件)

C语言源代码:

 1 #include<stdio.h>2 #include<stdlib.h>3 4 int main()  5 { 6     FILE *fp1, *fp2; // 文件指针 7     char ch;  // 用来接收读取到的字符 8     char filename1[] = "D:\\A.txt"; // 文件A的路径,需要读取的文件,如果文件不存在则出错 9     char filename2[] = "D:\\B.txt"; // 文件B的路径,将文件A.txt读取到的数据存入当前文件
10
11     fp1=fopen(filename1, "r"); // 以只读的方式打开文件A
12     fp2=fopen(filename2, "w"); // 以只写的方式打开文件B
13     if(fp1==NULL || fp2==NULL) // 判断文件是否打开成功
14     {   //打开文件失败了
15         printf("cannot open the file!\n");
16         exit(1);  // 退出程序 需要头文件<stdlib.h>
17     }
18
19     //---开始--读取文件并输出到屏幕上---//
20     ch=fgetc(fp1); // 读取第一个字符
21     while(ch!=EOF) // EOF即文件结束符
22     {
23         putchar(ch); // 将从文件A读取到的字符输出到屏幕上
24         ch=fgetc(fp1);  // 读取下一个字符
25     }
26     //---完成--读取文件并输出到屏幕上---//
27
28     //---开始--读取文件A并输出到文件B里面---//
29     rewind(fp1); // 将文件A的位置指针重新移到文件头
30     ch=fgetc(fp1); // 读取第一个字符
31     while(ch!=EOF) // EOF即文件结束符
32     {
33         fputc(ch,fp2); // 将从文件A读取到的字符写入到文件B内
34         ch=fgetc(fp1);  // 读取下一个字符
35     }
36     //---完成--读取文件A并输出到文件B里面---//
37
38     fclose(fp1);  //关闭数据文件
39     fclose(fp2);  //关闭数据文件
40     return 0;
41 }

C语言 文件操作的头文件相关推荐

  1. linux c之c语言符合标准的头文件和linux常用头文件

    1.C语言符合标准的头文件 #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h ...

  2. 单片机c语言怎样添加自定义头文件,单片机C语言编程与或|头文件常见问题

    一.常见问题 1.头文件reg51.h和reg52.h其实是一样的,大家两个都可以用. 2.main()前面的void可加可不加,反正都是无返回值函数. 3.不是每一个程序都要用到死循环while(1 ...

  3. 【酷熊科技】工作积累 ----------- Unity3D / c 语言 使用 Stringbuilder 引用头文件 using System.Text...

    使用 StringBuilder Unity3D / c 语言 使用 Stringbuilder 引用头文件 using System.Text 简述StringBuilder和String的区别? ...

  4. C语言两种导入头文件的区别

    C语言两种导入头文件的区别 #include<stdio.h> 和 #include"stdio.h" 这两种导入头文件的区别: 区别在于编译器查找头文件的顺序, &q ...

  5. mp4文件时长 c++源码_【C语言】如何使用头文件 .h 编译 C 源码!so easy!

    在 C 语言中,头文件或包含文件通常是一个源代码文件,程序员使用编译器指令将头文件包含进其他源文件的开始(或头部),由编译器在处理另一个源文件时自动包含进来. 一个头文件一般包含类.子程序.变量和其他 ...

  6. C语言基础教程之头文件

    C 头文件 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享.有两种类型的头文件:程序员编写的头文件和编译器自带的头文件. 在程序中要使用头文件,需要使用 C 预处 ...

  7. C语言的艺术之——头文件

    好记性不如烂笔头o(^▽^)o 系列的文章: <C语言的艺术之--头文件> <C语言的艺术之--函数> <C语言的艺术之--标识符命令与定义> <C语言的艺术 ...

  8. c语言请按照格式输出英文诗,C措辞文件包含与头文件写法(国外英语资料).doc

    C措辞文件包含与头文件写法(国外英语资料) 袜厦起佬宽方陵驶金网耳创子恩壤减棚逞涎鞭癌授诊湍支腐写蛛浦峻讼鹰募乌摊念楔渊幌化嘘沼串晨蛹沾单盅粉耻箔薯破炬惑抹坏鄂怕彰干腿讣髓雌愚枯翅喘奏侠薄向憎咬诛隋垒 ...

  9. C语言编程中关于头文件使用问题

    目录 1 头文件引用方式 2 头文件书写格式 2.1 条件编译 2.1.1 #ifdef... #else... #endif命令 2.1.2 #if defined... #else... #end ...

最新文章

  1. 接受返回值 server sql_SQL,何必在忆之一(基础篇)
  2. 每天一点Linux --- 目录的可执行权限
  3. 后面的参数_常用的JVM参数,你现在就记好
  4. SpringAMQP--发布订阅模型介绍
  5. WinForm窗体之间传值
  6. socket可以写成单例嘛_精读设计模式 Singleton 单例模式
  7. Acunetix Web Vulnarability Scanner V10.5 详细中文手册
  8. feign调用多个服务_SpringCloud服务间调用
  9. 【图像隐写】基于matlab FRFT+SVD盲水印嵌入+攻击+提取【含Matlab源码 1757期】
  10. java 设计模式的相似_聊聊Java中几种常用的设计模式
  11. MATLAB基础知识零基础到入门(第一期 基础内容)
  12. smart检测指标详解
  13. 腾讯股票接口API(4)——计算分时线平均值
  14. 梨花风起正清明,清明习俗知多少?
  15. VC编程——QQ连连看外挂
  16. 大学想选择计算机专业,零基础如何快速学习编程?都是经验之谈
  17. 2022年武汉经开区首次进入规模以上工业企业奖励资金申报条件时间及资料
  18. 有道云笔记 协作android版,有道云笔记Android版升级_软件资讯软件快报-中关村在线...
  19. 理解对数——金融问题中的自然对数(以e为底的对数)
  20. 【调剂】陆军工程大学2020年硕士研究生调剂工作办法

热门文章

  1. AngularJs使用ng-repeat实现数据循环展示的效果
  2. 雷蛇灵刃麦克风或蓝牙突然失效问题
  3. Android高级面试问题及答案(1)——Android Framework篇
  4. 常用的linux命令cd,linux常用命令:cd 命令
  5. 如何通过注册表的CLSID加载ITypeInfo
  6. Redisson 实现分布式锁原理
  7. 【数据结构】排序特辑:归并外排序(基础)
  8. 笔记:分布式大数据技术原理(二)构建在 Hadoop 框架之上的 Hive 与 Impala
  9. 从0到1腾讯云服务器使用教程(新手入门)
  10. vue中transition动画(移动端页面切换左右滑动效果)