IO进程day01(函数接口fopen、fclose、fgetc、fputc、fgets、fputs)

目录

函数接口

1》打开文件fopen

2》关闭文件fclose 

 3》文件读写操作

1> 每次读写一个字符:fgetc(),fputc()

 针对文件读写

 针对终端读写

 练习:实现 cat 命令功能    格式:cat 文件名

 2> 每次一个字符串的读写 fgets() 和 fputs()

 针对终端读写

 针对文件读写

练习:通过fgets实现"wc -l 文件名"命令功能(计算文件行数)


函数接口

1》打开文件fopen

man 3 fopen

FILE *fopen(const char *path, const char *mode);

功能:打开文件

参数:

path:打开的文件路径

mode:打开的方式

r:只读,当文件不存在时报错,文件流定位到文件开头

r+可读可写,当文件不存在时报错,文件流定位到文件开头

w:只写,文件不存在创建,存在则清空

w+可读可写,文件不存在创建,存在则清空

a:追加(在末尾写),文件不存在创建,存在追加,文件流定位到文件末尾

a+读和追加,文件不存在创建,存在追加,读文件流定位到文件开头,写文件流定位到文件末尾

注:当a+的方式打开文件时,写只能在末尾进行追加,定位操作是无法改变写的位置,但是可以改变读的位置

返回值:

成功:文件流

失败:NULL,并且会设置错误码

#include <stdio.h>int main(int argc, char const *argv[])
{
FILE *fp;fp = fopen("test.txt", "r");//只读方式打开文件if (NULL == fp)//文件不存在,返回-1{perror("fopen err");return -1;}printf("fopen success\n");//文件存在,返回成功return 0;
}
#include <stdio.h>int main(int argc, char const *argv[])
{
FILE *fp;fp = fopen("test.txt", "w");//只写方式打开文件if (NULL == fp)//文件不存在,创建,存在则清空{perror("fopen err");return -1;}printf("fopen success\n");//文件存在,返回成功return 0;
}
#include <stdio.h>int main(int argc, char const *argv[])
{
FILE *fp;fp = fopen("test.txt", "a");//追加方式打开文件,文件不存在,创建,读定位到开头,写定位到末尾if (NULL == fp){perror("fopen err");return -1;}printf("fopen success\n");//文件存在,返回成功return 0;
}

补充:

perror( )用来将上一个函数发生错误的原因输出到标准设备 (stderr) 。参数 s 所指的字符串会先打印出, 后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你设置的一些信息和现在的errno所对应的错误一起输出。

2》关闭文件fclose 

int fclose(FILE* stream);

功能:关闭文件

参数:stream:文件流

#include <stdio.h>

int main(int argc, char const *argv[])

{

FILE *fp;

//1.打开文件

//fp = fopen("test.txt", "r"); //如果不存在会错误,因为只读r模式

fp = fopen("test.txt", "w");

if (NULL == fp)

{

perror("fopen err");

// while(1); //标准错误不缓存,错误信息会打印

return -1;

}

printf("fopen success\n");

//2.关闭文件

fclose(fp);

return 0;

}

 3》文件读写操作

1> 每次读写一个字符:fgetc(),fputc()

每次读一个字符fgetc()

int fgetc(FILE * stream);

功能:从文件中读取一个字符,并将当前文件指针位置向后移动一个字符。

参数:stream:文件流

返回值:成功:读到的字符

失败或读到文件末尾EOF(-1)

每次写一个字符fputc()

int fputc(int c, FILE * stream);

功能:向文件中写入一个字符, 成功写入后文件指针会自动向后移动一个字节位置。

参数:c:要写的字符

stream:文件流

返回值:成功:写的字符的ASCII

失败EOF(-1)

 针对文件读写
#include <stdio.h>int main(int argc, char const *argv[])
{FILE *fp;//1.打开文件fp = fopen("test.txt", "r+");//可读可写方式打开if (NULL == fp){perror("fopen err");return -1;}printf("fopen success\n");char ch = fgetc(fp);//定义一个char类型变量接收读取的字符    每读取一次光标都会向后移printf("%d %c\n", ch, ch); //104 hch = fgetc(fp);printf("%d %c\n", ch, ch); //101 e//写的时候会先把光标移到末尾fputc('a', fp); //向文件中写个afputc('b', fp); //向文件中写个b//因为光标移动到末尾了,所以打印是EOFch = fgetc(fp);printf("%d %c\n", ch, ch); //-1 EOF 因为以及到末尾了//2.关闭文件fclose(fp);return 0;
}

 针对终端读写

#include <stdio.h>

int main(int argc, char const *argv[])

{

char ch;

ch = fgetc(stdin); //相当于getchar()

printf("%d %c\n", ch, ch);

fputc(ch, stdout); //相当于putchar()

fputc(10, stdout);

fputc('b', stdout);

return 0;

}

 补充:feof 和 ferror

int feof(FILE * stream);

功能:判断文件有没有到结尾,也就是当前所在位置后面还有没有字符。

返回:如果到达文件末尾,返回非零值。如果后面还有字符则返回0

#include <stdio.h>
int main()
{FILE *fp;fp = fopen(argv[1], "r");//打开命令行中输入的文件,if (NULL == fp){perror("fopen error\n");return -1;}printf("fopen success\n");char ch = fgetc(fp);//定义一个字符变量接收读取的内容printf("%d %c\n", ch, ch);//打印if (feof(fp))//判断此时光标是否在末尾{printf("end\n");return -1;}
//文件的末尾默认还有一个\0 EOF,读到最后一个有效数据时,不算末尾,需要再读一个才算光标到达末尾ch = fgetc(fp);printf("%d %c\n", ch, ch);if (feof(fp))//判断此时光标是否在末尾{printf("end\n");return -1;}
return 0;
}

 

int ferror(FILE * stream);

功能:检测文件有没有出错

返回:文件出错,返回非零值。如果没有出错,返回0

#include <stdio.h>
int main()
{    FILE *fp;fp = fopen(argv[1], "w");//w 只写,不可读if (NULL == fp){perror("fopen error\n");return -1;}printf("fopen success\n");char ch = fgetc(fp);//w 只写,不可读,这个操作在读文件,属于操作错误,这时用ferror函数去判断就会返回非零值printf("%d %c\n", ch, ch);if (ferror(fp))//ferror进行判断之前的操作是否有误{printf("error\n");return -1;}
return 0;
}
 练习:实现 cat 命令功能    格式:cat 文件名
#include <stdio.h>
/* cat 文件名:查看文件内容,显示到终端。步骤:1.打开文件 fopen2.循环用fgetc获取文件内容3.当读到文件末尾标志EOF时结束4.将读取文件内容用fputc打印到终端5.关闭文件
*/
int main(int argc, char const *argv[])
{if (argc != 2)//命令行文件名个数是否等于 2 {printf("err: %s <filename>\n", argv[0]); //提示一下正确的格式return -1;}//1.打开文件FILE *fp = fopen(argv[1], "r");//打开命令行中输入的文件名if (NULL == fp){perror("fopen err");return -1;}char ch = fgetc(fp);//读取文件中的字符while (!feof(fp))//当读取的光标处不是EOF时,说明没到末尾{fputc(ch, stdout);//输出一个字符ch = fgetc(fp);//读取字符,光标继续向后移动}//3. 关闭文件fclose(fp);return 0;
}
 2> 每次一个字符串的读写 fgets() 和 fputs()

char * fgets(char *s, int size, FILE * stream);

功能:从文件中每次读取一行字符串

参数: s:存放字符串的地址

size:期望一次读取的字符个数

stream:文件流

返回值:成功:s的地址

失败或读到文件末尾:NULL

特性: 每次实际读取的字符个数为size-1个,会在末尾自动添加\0

每次读一行,遇到\n或者到达文件末尾后不再继续读下一行

并把它存储在s所指向的字符串内。

int fputs(const char *s, FILE * stream);

功能:向文件中写字符串

参数:s:要写的内容

stream:文件流

返回值:成功:非负整数

失败:EOF

 针对终端读写
#include <stdio.h>int main(int argc, char const *argv[])
{char buf[32] = "";//输入操作fgets(buf, 32, stdin); //输入hello\n,  此时buf中存入内容: hello\n\0printf("buf: %s\n", buf);//每次输入都是从头开始写,,写完会自动补 0,会覆盖掉之前的内容,但\0 后的内容仍然存在fgets(buf, 32, stdin); //输入66\n,  此时buf中内容: 66\n\0o\n\0,printf("buf: %s\n", buf);//输出操作fputs("world", stdout);//把字符串输入到标准输出里fputs(buf, stdout);//把buf里的内容输入到标准输出里return 0;
}
 针对文件读写
#include <stdio.h>
int main(int argc, char const *argv[])
{FILE *fp;char buf[32] = "";fp = fopen("test.txt", "r+");//test.txt 文件中内容:hello\n  world\n  66\n\0if (NULL == fp){perror("fopen err");return -1;}printf("fopen success\n");//读写操作fgets(buf, 32, fp); //遇到\n或到达末尾后不再继续读  buf:hello\n\0fputs(buf, stdout);fgets(buf, 32, fp); //  继续读下一行  buf:world\n\0fputs(buf, stdout);fgets(buf, 32, fp); //buf: 66\0ld\n\0fputs(buf, stdout);//关闭文件fclose(fp);return 0;
}

练习:通过fgets实现"wc -l 文件名"命令功能(计算文件行数)

#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{FILE *fp;char buf[32] = "";if (argc != 2)//判断命令行指针数组的元素个数{printf("err: %s <filenme>\n",argv[0]);return -1;}fp = fopen(argv[1], "r");//打开该文件if (NULL == fp){perror("fopen err");return -1;}//循环fgets读文件, 只要读到就判断是否有\n, 如果有就累加行数int len = 0;while (fgets(buf, 32, fp) != NULL){if (buf[strlen(buf) - 1] == '\n')len++;}printf("%d %s\n", len, argv[1]);  //wc -l会少一行,因为最后一行没有换行fclose(fp);return 0;
}

今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!

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

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

相关文章

云原生系列 - Nginx(高级篇)

前言 学习视频&#xff1a;尚硅谷Nginx教程&#xff08;亿级流量nginx架构设计&#xff09;本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删学习文档&#xff1a; 云原生系列 - Nginx(基础篇)云原生系列 - Nginx(高级篇) 一、扩容 通过扩容提升整体吞吐量…

【非常简单】 猿人学web第一届 第12题 入门级js

这一题非常简单&#xff0c;只需要找到数据接口&#xff0c;请求参数 m生成的逻辑即可 查看数据接口 https://match.yuanrenxue.cn/api/match/12 查看请求对应的堆栈中的 requests 栈 list 为对应的请求参数 list 是由 btoa 函数传入 ‘yuanrenxue’ 对应的页码生成的 bto…

PD取电快充协议方案

PD快充协议是通过调整电压和电流来提供不同的充电功率。它采用了一种基于USB-C端口的通信协议&#xff0c;实现了充电器于设备之间的信息交换。在充电过程中设备会向充电器发出请求&#xff0c;要求提供不同的电压和电流&#xff0c;充电器接收到请求后&#xff0c;会根据设备的…

第6章 B+树索引

目录 6.1 没有索引的查找 6.1.1 在一个页中的查找 6.1.2 在很多页中查找 6.2 索引 6.2.1 一个简单的索引方案 6.2.2 InnoDB中的索引方案 6.2.2.1 聚簇索引 6.2.2.2 二级索引 6.2.2.3 联合索引 6.2.3 InnoDB的B树索引的注意事项 6.2.3.1 根页面万年不动窝 6.2.3.2 内节…

【vue】编辑器段落对应材料同步滚动交互

场景需求 编辑器段落对应显示材料编辑器滚动时&#xff0c;材料同步滚动编辑器段落无数据时&#xff0c;材料不显示 实现方法 编辑器与材料组件左右布局获取编辑器高度&#xff0c;材料高度与编辑器高度一致禁用材料组件的滚动事件获取编辑器段落距离顶部的位置&#xff0c;…

【机器学习-监督学习】支持向量机

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

缓存学习

缓存基本概念 概念 对于缓存&#xff0c;最普遍的理解是能让打开某些页面速度更快的工具。从技术角度来看&#xff0c;其本质上是因为缓存是基于内存建立的&#xff0c;而内存的读写速度相比之于硬盘快了xx倍&#xff0c;因此用内存来代替硬盘作为读写的介质当然能大大提高访…

WIFI驱动开发

Linux 4.9 内核驱动移植 Linux 4.9 BSP 内核驱动 下载驱动后获得驱动的 tar.gz 压缩包 解压后找到如下驱动与文件夹 进入内核&#xff0c;找到 linux-4.9/drivers/net/wireless 文件夹中&#xff0c;新建文件夹aic8800 并且把上面的驱动与文件夹放入刚刚创建好的 aic8800 中。…

【笔记篇】Davinci Configurator SomeIpXf模块

目录 1 简介1.1 架构概览2 功能描述2.1 特性2.2 初始化2.3 状态机2.4 主函数2.5 故障处理3 集成4 API描述5 配置1 简介 本文主要描述了AUTOSAR SomeIpXf模块的功能。 SomeIpXf主要用途是对数据进行SOME/IP格式的序列化和反序列化。 1.1 架构概览 SomeIpXf在AUTOSAR软件架构…

【python】OpenCV—Single Human Pose Estimation

文章目录 1、Human Pose Estimation2、模型介绍3、基于图片的单人人体关键点检测4、基于视频的单人人体关键点检测5、左右校正6、关键点平滑7、涉及到的库函数scipy.signal.savgol_filter 8、参考 1、Human Pose Estimation Human Pose Estimation&#xff0c;即人体姿态估计&…

sqli-labsSQL手工注入第26-30关

第26关 一.查询数据库 http://127.0.0.1/Less-26/?id11%27%26extractvalue(1,concat(%27~%27,database(),%27~%27))%261%27 二.查表 http://127.0.0.1/Less-26/?id1%27||(updatexml(1,concat(1,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(…

2月公开赛Web-ssrfme

考点&#xff1a; redis未授权访问 源码&#xff1a; <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);echo curl_exec($ch);curl_close($ch); }if(isset($_GET[url…

qt的model view 使用示范

首先在ui界面拖一个tableView ui->tableView->setModel(mission_model); 然后设置model的qss&#xff0c;并用view绑定model void SettingWidget::init_missionmodel(QString plane_type, QString mission_name) {if(mission_model)delete mission_model;mission_model…

论文导读 | 大语言模型中应用到的强化学习算法

摘要 在最近取得广泛关注的大规模语言模型&#xff08;LLM&#xff09;应用强化学习&#xff08;RL&#xff09;进行与人类行为的对齐&#xff0c;进而可以充分理解和回答人的指令&#xff0c;这一结果展现了强化学习在大规模NLP的丰富应用前景。本文介绍了LLM中应用到的RL技术…

【GH】【EXCEL】P6: Shapes

文章目录 componentslinepicture components line picture Picture A Picture object Input parameters: Worksheet (Generic Data) A Worksheet, Workbook, Range Object, Excel Application, or Text Worksheet NameName (Text) An optional object nameLocation (Point) A p…

Eclipse SVN 插件在线下载地址

Eclipse SVN 插件 Subversive 在线安装 1、选择help下的install new software 2、点击 add 3、Name随便写&#xff0c;Location输入&#xff1a; https://download.eclipse.org/technology/subversive/4.8/release/latest/ 点击Add 4、然后一直下一步&#xff0c;Finish&am…

Vue的计算属性:methods方法、computed计算属性、watch监听属性

1、methods 方法 在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。 【实例】在 Vue 应用程序中&#xff0c;使用 methods 选项定义获取用户信…

鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙中巧夺天工

gn是什么? gn 存在的意义是为了生成 ninja,如果熟悉前端开发,二者关系很像 Sass和CSS的关系. 为什么会有gn,说是有个叫even的谷歌负责构建系统的工程师在使用传统的makefile构建chrome时觉得太麻烦,不高效,所以设计了一套更简单,更高效新的构建工具gnninja,然后就被广泛的使用…

《机器学习》—— 通过下采样方法实现逻辑回归分类问题

文章目录 一、什么是下采样方法&#xff1f;二、通过下采样方法实现逻辑回归分类问题三、下采样的优缺点 一、什么是下采样方法&#xff1f; 机器学习中的下采样&#xff08;Undersampling&#xff09;方法是一种处理不平衡数据集的有效手段&#xff0c;特别是在数据集中某些类…

【每日一题】【区间合并】【贪心 模拟】多米诺骨牌 牛客小白月赛99 E题 C++

牛客小白月赛99 E题 多米诺骨牌 题目背景 牛客小白月赛99 题目描述 样例 #1 样例输入 #1 3 6 1 1 1 1 3 2 1 4 3 2 7 9 11 6 2 1 1 1 3 2 1 4 3 2 7 9 11 5 4 1 4 1 1 2 1 2 3 6 8样例输出 #1 3 6 5做题思路 按照玩多米诺骨牌的方式。 先将多米诺骨牌按照骨牌位置从小…