当前位置: 首页 > news >正文

C库函数文件操作(fopen、fread、fwrite、fclose)

C库函数

C文件操作用库函数实现,包含在stdio.h中,系统自动打开和关闭三个标准文件:

  • 标准输入-键盘(stdin)
  • 标准输出-显示器(stdout)
  • 标准出错输出-显示器(stderr)

文件打开—fopen()

函数原型:

FILE *fopen(const char *filename, const char *mode)

该函数使用给定的模式 mode 打开 filename 所指向的文件。其中mode值为以下:

文件使用方式含义
“r”打开一个用于读取的文件。该文件必须存在。
“w”创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
“a”追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
“r+”打开一个用于更新的文件,可读取也可写入。该文件必须存在。
“w+”创建一个用于读写的空文件。
“a+”打开一个用于读取和追加的文件。

返回值:该函数返回一个 指向文件结构体的FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。

文件读/写

函数原型:

size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
size_t fwrite ( void *ptr, size_t size, size_t count, FILE *fp );

fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。对参数的说明:

  • ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。
  • size:表示每个数据块的字节数。
  • count:表示要读写的数据块的块数。
  • fp:表示文件指针。

理论上,每次读写 size*count 个字节的数据。

返回值:返回成功读写的块数,也即 count
如果返回值小于 count:

  • 对于 fwrite() 来说,肯定发生了写入错误,可以用 ferror() 函数检测。
  • 对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror()feof() 检测。

文件关闭—fclose()

函数原型:fclose(fp)
作用:关闭fp指向的文件,使文件指针变量与文件“脱销”,释放文件结构体和文件指针。正常关闭返回0;出错时返回非0;

C库函数读写文件示例

编程,打开文件a.txt,将文件中的内容复制到文件c.txt中

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h> //文件信息控制
#define count 1 //数据块的个数
int main(int args,char*argv[])
{
        FILE *fp1,*fp2;
        long len=0;
        char *p;
        p=(char*)malloc(sizeof(char)*count);
        fp1=fopen("a.txt","r"); //以只读方式打开文件
        if(fp1==NULL)
        {
                printf("Open a.txt fail!");
                exit(1);
        }
        fp2=fopen("c.txt","w+");
        if(fp2==NULL)
        {
                printf("Open c.txt fail!");
                exit(1);
        }
        while(fread(p,sizeof(char),count,fp1)==1) //读取一个字符
        {
                fwrite(p,sizeof(char),count,fp2);
                len++;
        }
        fclose(fp1);
        fclose(fp2);
        free(p); //释放空间
        return 0;
}

相关文章:

  • QT之OpenGL深度测试
  • 初阶指针C
  • 【C++】CC++内存管理
  • 每日学术速递2.9
  • python selenium浏览器复用技术
  • Chapter4:机器人仿真
  • 我的网站上线了!
  • MySQL篇02-三大范式,多表查询
  • C进阶:预处理
  • ESP8266 + STC15基于AT指令通过TCP通讯协议获取时间
  • 编译与链接------《程序员的自我修养》
  • python(14)--集合
  • Minikube vs. kind vs. k3s vs k3d vs MicroK8s
  • SpringCloud 中 Config、Bus、Stream、Sleuth
  • SpringDataRedis快速入门
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【mysql】环境安装、服务启动、密码设置
  • 【RocksDB】TransactionDB源码分析
  • canvas绘制圆角头像
  • CSS3 变换
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Mysql优化
  • WebSocket使用
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 成为一名优秀的Developer的书单
  • 理清楚Vue的结构
  • 排序(1):冒泡排序
  • 前端技术周刊 2019-02-11 Serverless
  • 前端相关框架总和
  • 前言-如何学习区块链
  • 区块链技术特点之去中心化特性
  • 树莓派 - 使用须知
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信小程序--------语音识别(前端自己也能玩)
  • 追踪解析 FutureTask 源码
  • hi-nginx-1.3.4编译安装
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​渐进式Web应用PWA的未来
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (一)appium-desktop定位元素原理
  • (转)程序员疫苗:代码注入
  • (转)重识new
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET框架
  • .net网站发布-允许更新此预编译站点
  • @EnableAsync和@Async开始异步任务支持
  • @WebService和@WebMethod注解的用法
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [Android]How to use FFmpeg to decode Android f...
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BUUCTF]-Reverse:reverse3解析