C语言文件io操作

一、fopen

在C语言中,操作文件之前应该先打开文件。使用<stdio.h>头文件中的fopen()函数可以打开文件,因为FILE也是结构体,我们通过返回一个文件指针就可以对文件进行操作。在用完fopen之后要记得关闭该文件流。

用法:

FILE* fl = fopen("文件名","打开方式");

其中打开方式有:

 为了实现低耦合我们也可以这样写:

int main(int arg,char* argv[])
{FILE* fl = fopen(argv[1],"打开方式");fclose(fl);return 0;
}

因为在main函数中我们传入的是一个指向字符串的指针数组所以我们可以用argv[1]来表示传入的第二个字符串,一般我们Linux中第一个传入的参数是所要编译的文件,第二个才是所要操作的文件,所以可以这样写。这样我们就可以打开一个文件了,但是我们还没有对文件进行读写操作,所以控制台还不会有任何输出。

为了判断文件是否打开成功我们还可以用if语句进行判断一下:

int main(int arg,char* argv[])
{FILE* fl = fopen(argv[1],"打开方式");if(fl == NULL)
{perror("fopen error!\n");exit(0);
}fclose(fl);return 0;
}

如果fl打开失败则用函数perror打印一下,然后用exit(0)终止程序。注意:用exit()函数要加上include<stdlib.h>头文件 

二、fgetc

这个是最简单的读文件操作,这个函数用来从文件指针指向的文件中读一个字符,返回的值是读取的字符,如果发生错误则返回EOF

用法:

fgetc(文件指针);

int main()
{FILE* fl = fopen("test.txt","r");char ch = fgetc(fl);printf("%c",ch);fclose(fl);return 0;
}

在其中我们以只读的方式打开了文件test.txt,用fgetc()获取的fl指向文件的第一个字符,并把其赋值给了ch,假设我们test.txt文件内容是这样的:

abcd

则打印结果是:

 a

 三、fgets

与上面的fgetc()函数不同的是,fgets()函数是从一个文件中一次性读一行数据,并且它会把读取的字符串复制到缓冲区buf,并在最后追加一个null字符来终止字符串。

用法:

fgets(char *buf, int n, FILE* fl);

#define 10 SIZE
int main(int arg,char* argv[])
{FILE* fl = fopen(argv[1],"r");char buf[20];fgets(buf,SIZE,fl);fclose(fl);return 0;
}

 其中有两种情况:

1、当SIZE大于一行的字符串时,那么当读到字符串末尾的换行符时,fgets()会返回,并在buf的最后面插入字符串结束标志'\0'。而buf缓冲区剩余的位置不会再填充

2、当SIZE小于一行的字符串时,那么会读入n-1个字符,此时并没有读到末尾的'\n',但是还是会在buf缓冲区末尾加上'\0'

可以用while循环来输出fgets()函数读入的字符串

#define 10 SIZE
int main(int arg,char* argv[])
{FILE* fl = fopen(argv[1],"r");char buf[20];while(fgets(buf,SIZE,fl)!=NULL)
{printf("%s",buf);
}fclose(fl);return 0;
}

三、fputc

fputc是向指定的文件中写入一个字符

 用法:

fputc(int ch,FILE* fl);

其中ch为要写入的字符,fl为文件指针,fputc()写入成功时返回要写入的字符,失败时返回EOF

如:

#define 10 SIZE
int main(int arg,char* argv[])
{FILE* fl = fopen(argv[1],"a");char ch = 'a';fputc(ch,fl);fclose(fl);return 0;
}

注意:此时用的打开文件方式是a,a是往文件后面追加的意思,不会覆盖文件里面已有的内容,而用w的话就会覆盖掉文件里面已有的内容。

四、fputs

fputs()函数是将一行字符串写入到指定的文件中,但不包括空字符
用法:

fputs(char *str,FILE* fl);

 其中 str是要输入的字符串,fl是指向所要写入的文件的指针

#define 10 SIZE
int main(int arg,char* argv[])
{FILE* fl = fopen(argv[1],"打开方式");fputs("aabbcc",fl);fclose(fl);return 0;
}

其中将字符串aabbcc写入到了fl指向的文件中。

五、fscanf

fscanf函数是根据format格式从fl中读取数据,与fgets类似

int fscanf(FILE *fl, const char *format, [argument...]);

 其中fl是指向文件的指针,format是格式字符串,[argument...]是接收字符串的参数。fscanf()遇到空格、回车会断开,fgets遇到回车会断开

如:

#define 10 SIZE
int main(int arg,char* argv[])
{FILE* fl = fopen(argv[1],"r+");while(!feof(fl))
{char buf[10] = {0};fscanf(fl,%s,buf);printf("%s",buf);
}fclose(fl);return 0;
}

其中定义了一个buf缓冲区,将读取到的字符放到buf中,然后输出

六、fprintf

fprintf()函数用于向文件中输出格式化文本,与fputs类似

该函数类似于printf函数,只是printf将文本打印到命令窗口中,fprintf将文本输出到文件中

用法:

int fprintf (FILE* fl, const char*format, [argument...])

其中,fl为指向文件的指针,format为要写入格式,[argument]为可变参数。

 #include<stdio.h>#include<stdlib.h>int main(int arv,char *argv[]){FILE *fl = fopen(argv[1],"a");if(fl == NULL){perror("error!\n");exit(0);}char str[] = "abcdef";for(int i=0;i<6;i++){fprintf(fl,"buf[%d] = %c\n",i,str[i]);}fclose(fl);return 0;}

其中定义了一个字符串str,并用fprintf函数将该字符串以"buf[%d] = %c\n"格式输入到fl指向的文件中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 进程查找、杀死方案集合

一、查找进程 方式一 ps 命令&#xff1a;显示当前活动进程的快照。 # 显示所有用户的所有进程 $ ps aux# 显示所有进程的完整信息 $ ps -ef# 常用参数 -a&#xff1a;显示所有进程&#xff0c;包括其他用户的进程。 -u <用户>&#xff1a;仅显示指定用户的进程信息。 -x…

【多模态】20、OVR-CNN | 使用 caption 来实现开放词汇目标检测

文章目录 一、背景二、方法2.1 学习 视觉-语义 空间2.2 学习开放词汇目标检测 三、效果 论文&#xff1a;Open-Vocabulary Object Detection Using Captions 代码&#xff1a;https://github.com/alirezazareian/ovr-cnn 出处&#xff1a;CVPR2021 Oral 一、背景 目标检测数…

Redis系列一:介绍

介绍 The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. 相关资源 Redis 官网&#xff1a;https://redis.io/ 源码地址&#xff1a;https://github.com/redis/redis Redis 在线测试&#…

学习使用axios,绑定动态数据

目录 axios特性 案例一&#xff1a;通过axios获取笑话 案例二&#xff1a;调用城市天气api接口数据实现天气查询案例 axios特性 支持 Promise API 拦截请求和响应&#xff08;可以在请求前及响应前做某些操作&#xff0c;例如&#xff0c;在请求前想要在这个请求头中加一些…

msbuild - 对话

MSBuild是一个用于构建、部署和测试.NET应用程序的命令行工具。它是微软开发工具包&#xff08;Microsoft Build Tools&#xff09;中的一部分&#xff0c;常用于自动化构建和发布过程。 可以使用MSBuild来构建Visual Studio项目或解决方案&#xff0c;并根据需要执行各种操作…

springboot 整合tx-mybaits 实现crud操作

一 操作案例 1.1 工程结构 1.2 pom文件的配置 <!--spring boot的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId…

华为数通HCIA-地址分类及子网划分

ip地址&#xff08;逻辑地址&#xff09; 作用&#xff1a;唯一标识一张网卡 特点&#xff1a;设备天生没有&#xff0c;需要人为配置&#xff0c;可以随时修改 格式&#xff1a;点分十进制 大小&#xff1a;32bit 组成&#xff1a;网络位主机位 网络位&#xff1a;用于标…

Java:使用spring中的工厂模式ServiceLocatorFactoryBean实现多方支付功能

目录 项目结构完整代码测试参考视频 本文实现功能&#xff1a;使用spring中的工厂模式&#xff1a;ServiceLocatorFactoryBean实现多方支付功能。 项目结构 $ tree . ├── pom.xml └── src└── main└── java└── com└── example└── demo├── Application…

【机器学习】Multiple Variable Linear Regression

Multiple Variable Linear Regression 1、问题描述1.1 包含样例的X矩阵1.2 参数向量 w, b 2、多变量的模型预测2.1 逐元素进行预测2.2 向量点积进行预测 3、多变量线性回归模型计算损失4、多变量线性回归模型梯度下降4.1 计算梯度4.2梯度下降 首先&#xff0c;导入所需的库 im…

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation o…

Windows 10 中无法最大化任务栏中的程序

方法1&#xff1a;仅选择选项 PC 屏幕 如果您使用双显示器&#xff0c;有时这可能会发生在您的 1 台计算机已插入但您正在访问的应用程序正在另一台计算机上运行的情况下&#xff0c;因此您看不到任何选项。因此&#xff0c;请设置仅在主计算机上显示显示的 PC 屏幕选项。 第…

搭建自己第一个golang程序

概念&#xff1a; golang 和 java有些类似&#xff0c;配置好环境就可以直接编写运行了&#xff1b;这里分两种&#xff1a; 一.shell模式 创建一个go类型的文件 往里面编写代码 二.开发工具模式 这里的开发工具 我选用goland package mainimport "fmt"func mai…

Ubuntu 20.04.4 LTS安装Terminator终端(Linux系统推荐)

Terminator终端可以在一个窗口中创建多个终端&#xff0c;并且可以水平、垂直分割&#xff0c;运行ROS时很方便。 sudo apt install terminator这样安装完成后&#xff0c;使用快捷键Ctrl Alt T打开的就是新安装的terminator终端&#xff0c;可以使用以下方法仍然打开ubuntu默…

【数据结构】实验四:循环链表

实验四 循环链表 一、实验目的与要求 1&#xff09;熟悉循环链表的类型定义和基本操作&#xff1b; 2&#xff09;灵活应用循环链表解决具体应用问题。 二、实验内容 题目一&#xff1a;有n个小孩围成一圈&#xff0c;给他们从1开始依次编号&#xff0c;从编号为1的小孩开…

异步检索在 Elasticsearch 中的理论与实践

异步检索在 Elasticsearch 中的理论与实践 https://www.elastic.co/guide/en/elasticsearch/reference/8.1/async-search.html#submit-async-search 引言 Elasticsearch 是一种强大的分布式搜索和分析引擎&#xff0c;它能够快速地存储、搜索和分析大量数据。在处理大规模数据时…

Prometheus中的关键设计

1、标准先行&#xff0c;注重生态 Prometheus 最重要的规范就是指标命名方式&#xff0c;数据格式简单易读。比如&#xff0c;对于应用层面的监控&#xff0c;可以要求必须具备这几个信息。 指标名称 metric Prometheus 内置建立的规范就是叫 metric&#xff08;即 __name__…

正则表达式 —— Awk

Awk awk&#xff1a;文本三剑客之一&#xff0c;是功能最强大的文本工具 awk也是按行来进行操作&#xff0c;对行操作完之后&#xff0c;可以根据指定命令来对行取列 awk的分隔符&#xff0c;默认分隔符是空格或tab键&#xff0c;多个空格会压缩成一个 awk的用法 awk的格式…

学习day53

今天主要是做一个案例 TodoList 组件化编码流程&#xff1a; 1. 拆分静态组件&#xff1a;组件要按照功能点拆分&#xff0c;命名不要与html元素冲突 2.实现动态组件&#xff1a;考虑好数据的存放位置&#xff0c;数据是一个组件在用&#xff0c;还是一些组件在用&#xff1a…

ICMP协议(网际报文控制协议)详解

ICMP协议&#xff08;网际报文控制协议&#xff09;详解 ICMP协议的功能ICMP的报文格式常见的ICMP报文差错报文目的站不可达数据报超时 查询报文回送请求或回答 ICMP协议是一个网络层协议。 一个新搭建好的网络&#xff0c;往往需要先进行一个简单的测试&#xff0c;来验证网络…

线程池 LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue 的区别是什么 分别有什么优缺点

LinkedBlockingQueue、ArrayBlockingQueue 和 SynchronousQueue 都是 Java 中常用的阻塞队列实现&#xff0c;在线程池等多线程场景中经常用于保存等待执行的任务。它们之间的区别和各自的优缺点如下&#xff1a; LinkedBlockingQueue: 是一个基于链表的阻塞队列&#xff0c;…