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

news2024/9/23 23:25:46

目录

函数接口

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 h

    ch = fgetc(fp);
    printf("%d %c\n", ch, ch); //101 e

//写的时候会先把光标移到末尾
    fputc('a', fp); //向文件中写个a
    fputc('b', fp); //向文件中写个b

//因为光标移动到末尾了,所以打印是EOF
    ch = 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.打开文件 fopen
        2.循环用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\0
    printf("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\0
    if (NULL == fp)
    {
        perror("fopen err");
        return -1;
    }
    printf("fopen success\n");
    //读写操作
    fgets(buf, 32, fp); //遇到\n或到达末尾后不再继续读  buf:hello\n\0
    fputs(buf, stdout);

    fgets(buf, 32, fp); //  继续读下一行  buf:world\n\0
    fputs(buf, stdout);

    fgets(buf, 32, fp); //buf: 66\0ld\n\0
    fputs(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.coloradmin.cn/o/2071277.html

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

相关文章

数据集笔记: FourSquare - NYC and Tokyo Check-ins

FourSquare - NYC and Tokyo Check-ins (kaggle.com) 这个数据集包含了从2012年4月12日到2013年2月16日&#xff0c;约10个月时间内在纽约市和东京收集的签到数据。数据集中包含纽约市的227,428次签到和东京的573,703次签到。每个文件包括以下8个字段&#xff1a; 用户ID&…

Shell脚本学习_运算符

目录 一、算数运算符 1、expr命令&#xff1a; 2、算数运算符介绍&#xff1a; 3、使用 ( ( ) ) 进行运算&#xff1a; 4、bc命令&#xff1a; 1.bc中互动式的数学运算&#xff1a; 2.非互动式的管道运算&#xff1a; 3.非互动式的输入重定向运算&#xff1a; 二、比较运…

Kafka的基本概念

目录 1.Kafka的介绍 1.1介绍 1.2Kafka的概念 1.3.Kafka实现的日志聚合 1.4简单的收发消息 1.5其他消费模式 1.5.1指定消费进度 1.5.2分组消费 1.5.3查看消费者组的偏移量 1.6基于Zookeeper的Kafka集群 1.6.1使用集群的原因 1.6.2Kafka集群架构 1.6.3Topic下的Part…

2024年8月25日 十二生肖 今日运势

小运播报&#xff1a;2024年8月25日&#xff0c;星期日&#xff0c;农历七月廿二 &#xff08;甲辰年壬申月辛酉日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;龙、牛、蛇 需要注意&#xff1a;鸡、狗、兔 喜神方位&#xff1a;西南方 财神方位&#xff1a;…

UVM中的TLM(事务级建模)通信(2)

上一篇介绍了UVM中利用TLM进行的一对一通信&#xff1a;UVM中的TLM(事务级建模)通信(1)-CSDN博客&#xff0c;除此之外&#xff0c;UVM还有两种特殊的端口&#xff1a;analysis_port和analysis_export&#xff0c;用于完成一对多的通信。 1.analysis端口 这两种端口同样也是用于…

域名泛解析是什么?如何设置?

在当今数字化的时代&#xff0c;网站建设和网络运营对于企业和个人来说都变得至关重要。而在这个过程中&#xff0c;域名的管理和配置起着关键作用。其中&#xff0c;域名泛解析是一个重要的概念&#xff0c;它可以为网站的运营和管理带来诸多便利。 一、域名泛解析是什么&…

尚品汇静态网页设计

目录 尚品汇静态网页设计 在线浏览 项目结果展示 准备 顶部导航条设计 头部设计 主导航区设计 主要内容区设计 左侧边栏区 一级菜单 二级菜单 中间内容区 右侧其他内容区 上部分快报区 下部分图标导航区 秒杀区设计 楼层区设计 顶部设计 详情区设计 页脚设…

ResNet网络学习

简介 Residual Network 简称 ResNet (残差网络) 下面是ResNet的网络结构&#xff1a; ResNet详细介绍 原理 传统方法的问题&#xff1a; 对于一个网络&#xff0c;如果简单地增加深度&#xff0c;就会导致 梯度消失 或 梯度爆炸&#xff0c;我们采取的解决方法是 正则化。…

充电桩系统云快充协议源码(云快充协议1.5 版本源码)

介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 软件架构 1、提供云快充底层桩直连协议&#xff0c;版本为云快充1.5&#xff0c;对于没有对接过充电桩系统的开发者尤为合适&#xff1b; 2、包含&#xff1a;启…

搭建智能客服机器人:langgraph实现用户订单管理

大家好&#xff0c;今天我们将创建一个智能客服机器人&#xff0c;它能够记录用户的食物订单到真实数据库中&#xff0c;并允许用户查看他们的订单。这是一个相对高级的Langgraph项目&#xff0c;大家可以先看一下前面介绍的Langgraph的基础课程。 项目概述 我们要构建的系统…

C程序设计——运算符1

条件运算符 这是一个三目运算符&#xff0c;用于条件求值(?:)。 来源&#xff1a;百度百科 这是C语言里&#xff0c;唯一三目&#xff08;即三个表达式&#xff09;运算符。具体格式如下&#xff1a; (表达式1) ? (表达式2) : (表达式3) ; 翻译成人话&#xff0c;就是&…

测试资料4444

一、HTML 1、HTML介绍 1.1web前端三大核心技术 HTML:负责网页架构 CS&#xff1a;负责网页的样式、美化 JS:负责网页的行为 1.2 HTML标签 单标签:<标签名 > 双标签内容 标签属性&#xff1a; 2 常用标签 script:js标签 style:css标签 link:外部加载css标签

SyntaxError: Unexpected token ‘??=‘ 解决办法

问题 原因 Node 15, 及 以上版本才能使用 ?? 操作符 我的版本&#xff1a; 解决 尝试升级node版本 参考 windows下node升级到最新版本&#xff08;亲测有效&#xff09; 有错误&#xff0c;但也创建成功了。 错误以后再改吧…

初识LLM大模型:入门级工程知识探索与解析

前言 源自脉脉上面刷到的大模型业务工程落地可以做的方向。其实如果不是接触相关工作&#xff0c;有的人可能不会想了解这方面&#xff0c;自己实习做的方向与之相关&#xff0c;因此想调研总结一下行业热点方向与基础入门知识&#xff0c;还有一些的专业词汇的解释。包括但不…

异常—python

一、异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是异常, 也就是我们常说的BUG&#xff0c;那BUG是怎么由来的呢&#xff1f; 例如&#xff1a; print(1/0) 我们在小学的时候就知道0不能作除数&a…

线段树+二分,CF 431E - Chemistry Experiment

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 431E - Chemistry Experiment 二、解题报告 1、思路分析 贪心的考虑&…

NYX靶机笔记

NYX靶机笔记 概述 VulnHub里的简单靶机 靶机地址&#xff1a;https://download.vulnhub.com/nyx/nyxvm.zip 1、nmap扫描 1&#xff09;主机发现 # -sn 只做ping扫描&#xff0c;不做端口扫描 nmap -sn 192.168.84.1/24 # 发现靶机ip为 MAC Address: 00:50:56:E0:D5:D4 (V…

文心快码(Baidu Comate)初体验

文心快码&#xff08;Baidu Comate&#xff09;初体验 1文心快码简介和安装&#xff1a;简要介绍文心快码&#xff08;Baidu Comate&#xff09;、安装方法、使用方法等&#xff1b; Baidu Comate 是由百度自主研发&#xff0c;基于文心大模型&#xff0c;结合百度丰富的编程现…

【数模修炼之旅】08 支持向量机模型 深度解析(教程+代码)

【数模修炼之旅】08 支持向量机模型 深度解析&#xff08;教程代码&#xff09; 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法&#xff0c;大家可以关注这个专栏&#xff0c;持续学习哦&#xff0c;对于大家的能力提高会有极大的帮助。 1 支持向量机模型…

C++ TinyWebServer项目总结(10. 信号)

信号是由用户、系统、进程发送给目标进程的信息&#xff0c;以通知目标进程某个状态的改变或系统异常。Linux信号可由以下条件产生&#xff1a; 对于前台进程&#xff0c;用户可通过输入特殊终端字符来给它发送信号&#xff0c;如输入CtrlC通常会给进程发送一个中断信号。系统…