嵌入式学习——Shell(流指针、文件读写函数)——day20

1. 标准IO和文件IO的区别

        1. 标准IO是一种有缓存的IO形式(接收了一部分内容后给到linux内核中)

        2. 文件IO是一种没有缓存的IO形式(即刻交给linux内核,及时性)

        3. 标准IO是库函数,库函数可以在Windows和Linux系统中都能运行

        4. 文件IO是系统调用,系统调用是Linux内核中的函数接口,只能在Linux内核中使用

2. 流和流指针

        1. 流

        你声明一个FILE *fp ,并把fopen(某个文件)返回的值赋予fp这两个动作就相当于建立了一个水龙头,当你用getc(fp)之类的输入函数读取文件字符时就相当于拧开了水龙头,每读取一个字符,这个文件就像水一样的流动一下,fp所指的地址自然就向后移动了一位。

        int ch;

                while((ch=getc(fp))!=EOF)

        putchar(ch);

        这个循环,可以读取一个文件的所有字符。如果不是流的话,ch永远是第一个字符,不会更新。也可以理解为,fp自动++(一个字符的大小)。

        2. 流指针

        它主要用于跟踪文件的当前位置以及指示下一个读取或写入操作将在文件中进行的位置。流指针的主要作用是跟踪文件的位置,这样在进行文件读写操作时就知道从哪里开始读取或者写入数据。在文件读取时,流指针会自动向前移动,以便指向下一个要读取的数据;而在文件写入时,流指针也会相应地移动,以便确保数据被写入到正确的位置。

3. 文件的分类

        文件分为文本文件和二进制文件

4. fopen

4.1 定义

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

4.2 功能

        打开一个文件,并与文件建立一个流

4.3 参数

       1.  pathname:指向文件路径字符串的首地址的指针 

       2.  mode:指向一个字符串的指针

            "r"        只读打开            文件存在只读打开,文件不存在报错
            "r+"    读写打开            文件存在读写打开,文件不存在报错
            "w"        只写打开            文件存在清0只写打开,文件不存在创建文件
            "w+"    写读打开            文件存在清0写读打开,文件不存在创建文件
            "a"        追加只写打开        文件存在追加只写打开,文件不存在创建文件
            "a+"    追加读写打开        文件存在追加写读打开,文件不存在创建文件

        3.  返回值

               成功返回一个文件流指针
               失败返回NULL

4.4 示例代码

FILE* fp = fopen("1.txt","w");if(NULL == fp){printf("fopen error\n");return 1;}

5. fclose

5.1 定义

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

5.2 功能

        关闭文件流指针对应的流

5.3 参数

      stream:文件流指针 

5.4   返回值

        成功返回0 
        失败返回EOF(-1)

6. fputc

6.1 定义

        int fputc(int c, FILE *stream);   

6.2 功能

       向流中写入c对应的字符

6.3 参数

            c:写入流中的字符对应的ASCII码值
            stream:文件流指针

6.4   返回值

            成功返回写入字符对应的ASCII码值
            失败返回EOF(-1)

6.5 注意

            1.只能写字符
            2.只能写一个字符

6.6 示例代码

#include <stdio.h>int main(void)
{FILE *fp = NULL;int ch = 0;fp = fopen("1.c", "w");if (NULL == fp){printf("fopen failed!\n");return -1;}ch = fputc('A', fp);printf("ch = %c\n", ch);fclose(fp);return 0;
}

7. fgetc

7.1 定义

        int fgetc(FILE *stream)   

7.2 功能

        从流中读取一个字符

7.3 参数

      stream:文件流指针 

7.4   返回值

            成功返回读取到的字符的ASCII码值
            读到文件末尾返回EOF(用做读取文件的结束条件)
            读取出错返回EOF

7.5 示例代码

#include <stdio.h>int main(void)
{FILE *fp = NULL;int ch = 0;fp = fopen("1.c", "r");if (NULL == fp){printf("fopen failed!\n");return -1;}while (1){ch = fgetc(fp);if (ch == EOF){break;}printf("ch = %c\n", ch);}fclose(fp);return 0;
}

7.6 使用fputc和fgetc实现cp

#include <stdio.h>int main(int argc, char *argv[])
{FILE *src = NULL;FILE *dst = NULL;if(argc<3){printf("输入有误,请重新输入!\n");return 1;}src = fopen(argv[1], "r");dst = fopen(argv[2], "w");if (NULL == src || NULL == dst){printf("fopen failed!\n");return -1;}while (1){int ch = 0;ch = fgetc(src);if (EOF == ch){break;}fputc(ch, dst);}fclose(src);fclose(dst);return 0;
}

8. fputs

8.1 定义

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

8.2 功能

        向流中写入s指针指向的字符串

8.3 参数

            s:要写入流中的字符串的首地址
            stream:文件流指针 

8.4   返回值

            成功返回非负数
            失败返回EOF

8.5 示例代码

#include <stdio.h>int main(void)
{FILE *fp = NULL;fp = fopen("1.c", "w");if (NULL == fp){printf("fopen failed!\n");return -1;}fputs("SuperCarryDoinb", fp);fclose(fp);return 0;
}

9. fgets

9.1 定义

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

9.2 功能

        从流中尝试读取size个字符,存放到s指针指向的空间

9.3 参数

            s:存放字符串空间首地址
            size:尝试读取字符的个数
            stream:文件流指针 

9.4   返回值

            成功返回s(存放字符串空间首地址)
            失败返回NULL
            读到文件末尾返回NULL

9.5 示例代码

        1. 读单行

#include <stdio.h>int main(void)
{FILE *fp = NULL;char str[32] = {0};char *ch = NULL;fp = fopen("1.c", "r");if (NULL == fp){printf("fopen failed!\n");return -1;}ch = fgets(str, 16, fp);printf("str = %s\n", ch);fclose(fp);return 0;
}

        2. 读多行

#include <stdio.h>int main(void)
{FILE *fp = NULL;fp = fopen("/etc/passwd", "r");if (NULL == fp){printf("fopen failed!\n");return -1;}while (1){char str[512] = {0};char *ch = NULL;ch = fgets(str, sizeof(str), fp);if (NULL == ch){break;}printf("%s", ch);}fclose(fp);return 0;
}

        3.l利用fputs和fgets实现cp功能

#include <stdio.h>int main(int argc, char *argv[])
{FILE *src = NULL;FILE *dst = NULL;if(argc<3){printf("输入有误,请重新输入!\n");return 1;}src = fopen(argv[1], "r");dst = fopen(argv[2], "w");if (NULL == src || NULL == dst){printf("fopen failed!\n");return -1;}while (1){char str[512] = {0};char *ch = NULL;ch = fgets(str, sizeof(str), src);if (NULL == ch){break;}fputs(str, dst);}fclose(src);fclose(dst);return 0;
}

 

10. fwrite

10.1 定义

        size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);  

10.2 功能

        向流中写入ptr指向的nmemb个对象,每个对象size个字节

10.3 参数

        ptr:存放数据空间的首地址
        size:每个对象的大小
        nemeb:对象的个数
        stream:文件流指针 

10.4   返回值

        成功返回写入对象的个数
        失败返回0 

10.5  示例代码

#include <stdio.h>int main(void)
{FILE *fp = NULL;char str[32] = "SuperSorryDoinb";fp = fopen("1.c", "w");if (NULL == fp){printf("fopen failed!\n");return -1;}fwrite(str, sizeof(char), 15, fp);fclose(fp);return 0;
}

11. fread

11.1 定义

        size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

11.2 功能

        从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间

11.3 参数

        ptr:存放数据空间首地址
        size:对象大小
        nmemb:对象个数 
        stream:文件流指针 

11.4   返回值

        成功返回实际读取到对象的个数
        失败返回0 
        读到文件末尾返回0 

11.5  示例代码

        1. 

#include <stdio.h>int main(void)
{FILE *fp = NULL;char str[32] = {0};fp = fopen("1.c", "r");if (NULL == fp){printf("fopen failed!\n");return -1;}fread(str, sizeof(char), 15, fp);printf("str = %s\n", str);fclose(fp);return 0;
}

        2. 利用fwrite和read实现cp功能

#include <stdio.h>int main(int argc, char *argv[])
{FILE *src = NULL;FILE *dst = NULL;char str[32] = {0};src = fopen(argv[1], "r");dst = fopen(argv[2], "w");if (NULL == src || NULL == dst){printf("fopen failed!\n");return -1;}fread(str, sizeof(char), 15, src);fwrite(str, sizeof(char), 15, dst);fclose(src);fclose(dst);return 0;
}

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

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

相关文章

Linux下Code_Aster源码编译安装及使用

目录 软件介绍 基本依赖 其它依赖 一、源码下载 二、解压缩 三、编译安装 四、算例运行 软件介绍 Code_aster为法国电力集团&#xff08;EDF&#xff09;自1989年起开始研发的通用结构和热力耦合有限元仿真软件。Code_aster可用于力学、热学和声学等物理现象的仿真分析&…

OV通配符/泛域名SSL证书怎么获取和安装

OV通配符/泛域名SSL证书的获取和安装主要可以分为以下几个步骤&#xff1a; 一、获取证书 1. 选择服务商 选择一个提供OV通配符SSL证书的服务商&#xff0c;例如JoySSL。 2. 提交申请 在服务商网站上选择OV通配符SSL证书产品&#xff0c;填入基础信息&#xff0c;如公司名…

下单制造fpc的工艺参数

FPC工艺简介 - 百度文库 (baidu.com) FPC工艺参数 - 豆丁网 (docin.com) FPC柔性线路板的主要参数.ppt (book118.com) 捷多邦&#xff1a; 华秋&#xff1a; 背胶&#xff1a; FPC板背胶是可以粘接在光滑表面的一种薄型胶带&#xff0c;可以在狭小以及光滑的表面上用来提供高…

[蓝桥杯]真题讲解:抓娃娃(思维+二分)

[蓝桥杯]真题讲解&#xff1a;抓娃娃&#xff08;思维二分&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;抓娃娃&#xff08;思维二分&#xff09;&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #d…

3月份太阳镜行业线上市场销售数据分析

在消费者行为方面&#xff0c;太阳镜不仅仅是视力保护工具&#xff0c;更逐渐成为一种时尚单品。随着人们对健康和美容重视程度的提高&#xff0c;太阳镜作为体现个人风格的单品&#xff0c;其市场需求得到了进一步的推动。此外&#xff0c;全球旅行和旅游业的恢复&#xff0c;…

【链路层和局域网】

文章目录 链路层和局域网网络节点的连接方式数据链路层和局域网链路层导论链路层&#xff1a;上下文链路层服务链路层在哪里实现&#xff1f;适配器通信错误检测奇偶校验校验和&#xff1a;CRC&#xff08;循环冗余校验&#xff09;多点访问链路和协议多路访问协议MAC&#xff…

OpenStack虚拟机管理实例

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、OpenStack计算服务 1、什么是Nova 2、Nova所用的虚拟技术 3、Nova的系统架构 4、虚拟机实例化流程 一、示例 1、验证Nova服务 2、试…

国标GB28181协议EasyCVR视频汇聚平台获取设备录像仅展示部分片段的原因排查

国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xf…

Calendar 366 II for Mac v2.15.5激活版:智能日历管理软件

在繁忙的工作和生活中&#xff0c;如何高效管理日程成为了许多人的难题。Calendar 366 II for Mac&#xff0c;作为一款全方位的日历管理软件&#xff0c;以其独特的功能和优秀的用户体验&#xff0c;成为您的日程好帮手。 Calendar 366 II for Mac支持多种视图模式&#xff0c…

指针(4)

1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; 一般使用: int main() {char i a;char* p &i;*p q;printf("%c", i);return 0; } 然后我们看这个例子,这是把⼀个字符串放到pstr指针变量里了吗&#xff1f; 事实上不是,他只是将…

微软推出的Microsoft Fabric 到底是什么?

近期&#xff0c;总有客户问小编&#xff0c;微软推出的 Microsoft Fabric 是什么&#xff1f;这个产品有什么特别之处呢&#xff1f;希望下面这篇文章能为大家解开一些疑惑。 微软Fabric是2023年5月推出的一个数据分析平台&#xff0c;它将关键数据管理和分析工作负载整合到一…

联合新能源汽车有限公司出席2024年7月8日杭州快递物流展

参展企业介绍 青岛联合新能源汽车有限公司&#xff08;简称&#xff1a;联合汽车&#xff09;&#xff0c;是一家专注于纯电动汽车领域创新的科技公司&#xff0c;在国内率先提出车电分离&#xff0c;电池标准化并共享的方案&#xff0c;研发了包含标准电池、电池仓、可换电纯电…