[C语言]文件操作函数

​ 本文主要学习**fopenfclosefgetcfgetsfputcfputsfwritefreadfeof**这几个文件操作函数。

​ 以上函数,需要导入头文件 stdio.h

​ 为什么要学习这些函数?肯定是因为我们需要存储我们的数据,使数据放入到硬盘中方便保存。

​ 本文中梳理一些最常见的文件操作函数。

前言:文本文件和二进制文件

​ 根据数据的组织形式,数据文件被称为文本文件或者二进制文件

​ 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件

​ 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

一.文件的打开与关闭

文件指针

​ 缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

​ 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.

文件指针的创建

FILE* pf

​ 定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件

二. fopenfclose

fopenfclose一般是成对出现的,有 fopen 就会有 fclose

fopen是打开文件的函数,fclose是关闭文件的函数

函数参数介绍

//打开文件
FILE * fopen ( const char * filename, const char * mode );//关闭文件
fclose ( FILE * stream);

fopen的第一个参数,表示要打开的文件,如果在本目录下,直接书写文件名即可,如果不在本目录,就需要写出文件绝对路径。

fopen 的第二个参数表示对文件的操作形式,可看下图来学习。

fclose则是关闭我们打开的文件。

实例

​ 在使用完fopen函数后,最好判断一下, fopen文件函数是否返回空指针NULL

int main()
{FILE* pr = fopen("data.txt", "r");//第一个参数是我要打开的文件名,第二个参数代表对文件的操作是“只读”if (NULL == pr)//判断pr是否文件是否打开成功{printf("open for reading : %s", strerror(errno));return 0;}FILE* pw = fopen("data2.txt", "w");//第一个参数是我要打开的文件名,第二个参数代表对文件的操作是“写入”if (NULL == pw)//判断文件是否打开成功{printf("open for writing : %s", strerror(errno));fclose(pr);//如果打开此文件失败,则关闭上一个文件。pr = NULL;return 0;}fclose(pr);//文件使用完成后,关闭文件pr = NULL;//并将文件指针置空fclose(pw);pw = NULL;return 0;
}

三. fputcfgetc

​ 这两个文件函数在上个案列的代码演示中已经出现, fgetc 是读取文件中的字符, fputc是将字符输出到文件中。

//fgetc的函数参数
int fgetc( FILE *stream );//stream代表将要读取字符的文件//fputc的函数参数
int fputc( int c, FILE *stream );// c 代表我们将要存入的字符,stream是我们存放 c 的文件。

实例

​ 这是结合了上一个实例而成的。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{FILE* pr = fopen("data.txt", "r");//第一个参数是我要打开的文件名,第二个参数代表对文件的操作是“只读”if (NULL == pr)//判断pr是否文件是否打开成功{printf("open for reading : %s", strerror(errno));return 0;}FILE* pw = fopen("data2.txt", "w");//第一个参数是我要打开的文件名,第二个参数代表对文件的操作是“写入”if (NULL == pw)//判断文件是否打开成功{printf("open for writing : %s", strerror(errno));fclose(pr);//如果打开此文件失败,则关闭上一个文件。pr = NULL;return 0;}int ch = 0;while ((ch = fgetc(pr)) != EOF)//将“data.txt”文件的所有所有内容都写进“data2.txt”这个文件{fputc(ch, pw);}return 0;
}

四. fgetsfputs

fgets 是读取文件中数据的一行,相反,fputs则是输出一行到文件。

函数参数介绍

//fgets的函数参数
char *fgets( char *string, int n, FILE *stream );//第一个参数是我们接收文件中数据的字符串,第二个参数 n 表示我们要读取几个字符,不过字符数是 (n-1)个字符,第三个参数则是我们要读取的文件。//fputs的函数参数
int fputs( const char *string, FILE *stream );//这个函数的参数实际和fgetc差不多,不过这里输出的是字符串到文件stream中,而不是一个字符。

实例

​ 将数据输入到文件中,再次提醒,如果文件不在本目录下,需要加上绝对路径

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (NULL == pf){printf("open for write : %s", strerror(errno));return 0;}fputs("hello world\n", pf);fputs("haha\n", pf);fclose(pf);pf = NULL;return 0;
}

读取文件

int main()
{FILE* pf = fopen("data.txt", "r");if (NULL == pf){printf("open for write : %s", strerror(errno));return 0;}char arr[2] = { 0 };//开辟两个空间来接收数据fgets(arr, 13, pf);// fgets只能读取(n-1)个字符,所以是13printf("%s", arr); fgets(arr+1, 5 , pf);printf("%s", arr+1);fclose(pf);pf = NULL;return 0;
}

五.fwritefread

fwrite是二进制输出,也就是说,将内容以二进制的形式进行输出到文件中保存。

fread则是读取文件的以二进制保存的数据。

函数参数介绍

//fwrite函数参数
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );//第一个参数buffer表示我们要输出的数据的地址,第二参数size是我们要输出的数据大小,第三个参数是count是我们要输入的数据个数,第四个参数则是我们要将数据输入到的文件。//fread函数参数
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );//第一个参数buffer表示我们要接收的数据的地址,第二参数size是我们要接收的数据大小,第三个参数是count是我们要接收的数据个数,第四个参数则是我们要将数据输入到的buffer的文件。

实例

fwrite 二进制输出

#include <stdio.h>
#include <errno.h>
#include <string.h>
struct Stu
{int age;char name[10];char id[20];
};
int main()
{struct Stu s[2] = { { 12, "zhangsan", "253534123" }, {13,"lisi","342342354"}};FILE* pr = fopen("date.txt", "wb");//wb表示:为了输出数据,打开一个二进制文件if (NULL == pr){printf("open for writing : %s", strerror(errno));}fwrite(&s, sizeof(struct Stu), 2, pr);fclose(pr);pr = NULL;return 0;
}

运行后:

使用 fread 读取date.txt中的数据

#include <stdio.h>
#include <errno.h>
#include <string.h>
struct Stu
{int age;char name[10];char id[20];
};
int main()
{struct Stu s[2] = { 0 };//开辟两个相同的结构体数组来接收数据FILE* pr = fopen("date.txt", "rb");if (NULL == pr){printf("open for writing : %s", strerror(errno));}fread(s, sizeof(struct Stu), 2, pr);printf("%s %d %s\n", s[0].name, s[0].age, s[0].id);printf("%s %d %s\n", s[1].name, s[1].age, s[1].id);fclose(pr);pr = NULL;return 0;
}

​ 文件读取成功

六.feof

应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

1.文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如:

fgetc 判断是否为 EOF .

fgets 判断返回值是否为 NULL .

2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

​ 例如:

fread判断返回值是否小于实际要读的个数。

实例

文本文件的例子

#include <stdio.h>
#include <stdlib.h>
int main(void) {int c; // 注意:int,非char,要求处理EOFFILE* fp = fopen("test.txt", "r");if(!fp) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环{ putchar(c);}//判断是什么原因结束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);
}

二进制文件的例子

#include <stdio.h>
enum { SIZE = 5 };
int main(void) {double a[SIZE] = {1.,2.,3.,4.,5.};FILE *fp = fopen("test.bin", "wb"); // 必须用二进制模式fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp = fopen("test.bin","rb");size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组if(ret_code == SIZE) {puts("Array read successfully, contents: ");for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);putchar('\n');} else { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}

[C语言]文件操作函数相关推荐

  1. C语言文件操作函数大全(看到总结的真的很好,就转载贡献给大家了)

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * st ...

  2. c语言全文件操作函数,C语言文件操作函数大全

    C语言 文件操作函数大全 C语言文件操作函数 2007-10-17 19:21 13.1C语言文件 1,两种文件存取方式(输入,输出方式) 顺序存取 直接存取 2,数据的两种存放形式 文本文件 二进制 ...

  3. c语言 freopen txt_C语言文件操作函数freopen详解

    C语言文件操作函数freopen详解 今天做USACO 用到了文件的操作. 之前做USACO只是格式化的.些 写 freopen("xxx.in","r",st ...

  4. C语言——文件操作函数 fseek、ftell、rewind详解

    前言 前面,我讲了讲文件操作的第二步:文件的读写操作,里面详细的介绍了各类读写函数的用法,有兴趣的小伙伴可以去看看: C语言--文件操作(2)文件的读写操作_ 接下来,我再来讲一讲关于标题中这三个函数 ...

  5. c语言文件操作函数(未完待续)

    while(!feof(fp1)),使用feof()的时候会比你期望的多执行一次.因为它检测到结尾的'\0',时仍然不是文件的结尾,所以会继续执行一次.为解决这个问题,可以先读,在判断,然后打印 fr ...

  6. ios怎么打开c语言文件操作函数,C++ ofstream和ifstream详细用法以及C语言的file用法...

    ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,所有的I/O都以这个"流"类为基础的,包括我们 ...

  7. C语言文件操作函数总结——超详细

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 文件与流 在C语言中有三种标准流: stdin(standard input stream)标 ...

  8. C语言文件操作函数详解

    转载自https://www.cnblogs.com/saolv/p/7793379.html C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现.文件操作标准库 ...

  9. C语言文件操作函数大全

    unix中一切皆文件,所以文件操作至关重要! clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearer ...

最新文章

  1. jquery下载教程
  2. 【Flutter】Dart 面向对象 ( 命名构造方法 | 工厂构造方法 | 命名工厂构造方法 )
  3. C#串口上位机软件--IOT串口调试精灵
  4. 演示:混合配置基于Linux winows cisco环境动态路由
  5. 老干妈如今做到这么大,为什么她就是没遇到竞敌?
  6. 使用pipenv代替virtualenv管理python包
  7. 施密特正交化_格拉姆-施密特正交化--QR分解法的来源
  8. java webservice soap请求_使用Java对WebService的SOAP请求
  9. 被小程序冲击的人,请正视小程序!
  10. nvme装系统不能自引导_新买的固态硬盘用AHCI不能装系统,而用IDE却可以?问题就在这里...
  11. java编译命令是什么_Java编译命令整理
  12. 数学分析:集合的基本概念
  13. python修改app定位_APP自动化中三大定位工具
  14. matlab画出n的阶乘,matlab计算n的阶乘函数程序
  15. Sybase数据库按条件导出数据文件
  16. python中成语接龙游戏_python爬虫实现成语接龙1.0
  17. 自建CA并签名server证书实现https
  18. 创业公司技术总监出去面试,被拒后的感悟
  19. 最简单DIY基于51单片机的舵机控制器
  20. 专家:滴滴优步合并存大数据垄断隐忧

热门文章

  1. ExtJs 和后台数据的交互方式
  2. MySQL进阶--数据库的触发器详解
  3. Redis实战篇--优惠券秒杀
  4. 从华为砍掉边缘业务,窥探华为业务线之庞大
  5. 美甲店管理软件的应用介绍
  6. APP “本机号码一键登录”,是如何实现的?
  7. Express解决跨域问题
  8. 【渗透练习系列】DVWA靶机实战,通过XSS盗取cookie登录-02
  9. [AndroidStudio]安装、启动、模拟器相关、adb命令
  10. 在windows下对android进行实时快速录屏和模拟点击(二)——win32 API操控模拟器