嵌入式学习——Linux高级编程复习(标准IO)——day36

1. 标准IO概念——(有缓存、流指针)

(1)标准IO是编程语言中处理输入和输出的一种通用方法,涉及以下三个预定义的文件指针:

        1. stdin:标准输入,通常默认关联到键盘输入。

        2. stdout:标准输出,通常默认关联到屏幕输出。

        3.  stderr:标准错误,同样通常关联到屏幕输出。

        注意:stdin、stdout、stderr程序默认打开

(2)除此之外,标准IO库还支持文件操作,通过fopen打开文件,fclose关闭文件,以及fread, fwrite, fscanf, fprintf等函数进行读写操作。此外,它还处理不同类型的缓冲策略(全缓冲、行缓冲、无缓冲)来优化I/O性能。

(3)标准IO的一个重要特点是它对字符流进行了抽象,使程序可以一致地处理文本和二进制数据

        ASCLL码文件:程序代码、文本文件 ——  fgetc/fputc、fgets/fputs 、fprintf/fscanf

        二进制文件:音视频、图片、压缩包  ——  fwrite/fread

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

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

2. 流和流指针

2.1 流

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

        int ch;

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

        putchar(ch);

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

2.2 流指针

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

2. 标准IO——函数接口整理

    1.打开文件    fopen
    2.读写文件
                        fgetc/fputc
                        fgets/fputs 
                        fprintf/fscanf

                        fwrite/fread
    3.关闭文件    fclose

    4. 流的定位函数接口

                        fseek、rewind、ftell

2.1 fopen

        1. 定义

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

        2. 功能

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

        3. 参数

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

                mode:指向一个字符串的指针
                    "r"        只读打开               文件存在只读打开,文件不存在报错
                    "r+"      读写打开               文件存在读写打开,文件不存在报错
                    "w"       只写打开               文件存在清0只写打开,文件不存在创建文件
                    "w+"     写读打开               文件存在清0写读打开,文件不存在创建文件
                    "a"        追加只写打开        文件存在追加只写打开,文件不存在创建文件
                    "a+"      追加读写打开        文件存在追加写读打开,文件不存在创建文

        4. 返回值

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

        5. 示例程序

#include <stdio.h>int main(void)
{FILE *fp = NULL;fp = fopen("file.txt", "a");if (NULL == fp){perror("fail to fopen");return -1;}return 0;
}

        6. 注意

                perror功能和printf类似,但perror能打印出错的原因

2.2 fclose

        1. 定义

              int fclose(FILE *stream); 

        2. 功能

                关闭文件流指针对应的流

        3. 参数

                stream:文件流指针 

        4. 返回值

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

        5. 示例程序

#include <stdio.h>int main(void)
{FILE *fp = NULL;fp = fopen("a.txt", "w");if (NULL == fp){perror("fail to fopen");return -1;}fclose(fp);return 0;
}

        6. 注意

        正常情况下都会关掉,不用在意返回值

2.3 fputc

        1. 定义

                  int fputc(int c, FILE *stream);

        2. 功能

                    向流中写入c对应的字符

        3. 参数

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

        4. 返回值

        5. 示例程序

        6. 注意

2.4 fgetc

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.5 fputs

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.6 fgets

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.7 fwrite

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.8 fread

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.9 fprintf

        1. 定义

        2. 功能

                向指定流中打印格式化字符串

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.10 fscanf

        1. 定义

                int fprintf(FILE *stream, const char *format, ...);

        2. 功能

                从流中接收格式化字符串

        3. 参数

                stream:文件流指针
                format:字符串格式
                ...:变量表达式

        4. 返回值

                成功返回打印字符的个数
                失败返回负数

        5. 示例程序

#include <stdio.h>int main(void)
{FILE *fp = NULL;int num1 = 200;int num2 = 300;char tmpbuff[1024] = {0};int year = 2022;int mon = 8;int day = 10;int hour = 10;int min = 16;double pi = 3.1415926;fp = fopen("file.txt", "w");if (NULL == fp){perror("fail to fopen");return -1;}//  fprintf(fp, "[%04d-%02d-%02d %02d:%02d]:%.2lf\n", year, mon, day, hour, min, pi);
#if 1fprintf(fp, "hello world\n");fprintf(fp, "num1 = %d, num2 = %d\n", num1, num2);
//    sprintf(tmpbuff, "num1 = %d, num2 = %d\n", num1, num2);
//    fputs(tmpbuff, fp);
#endiffclose(fp);return 0;
}

        6. 补充:

        sprintf

        sprintf函数是C语言中的一个格式化输出函数,类似于printf,但它不是将输出写到标准输出(通常是屏幕),而是格式化后的字符串会被写入到一个字符数组(缓冲区)中

#include <stdio.h>int main() {char buffer[50]; // 创建一个足够大的缓冲区来存放格式化后的字符串// 将整数和浮点数格式化到字符串中int num = 123;float pi = 3.14159f;sprintf(buffer, "Number: %d, PI: %.2f", num, pi);// 输出缓冲区中的字符串printf("Formatted string: %s\n", buffer);return 0;
}

        sscanf

        sscanf是C语言中的一个函数,用于从字符串中读取数据并根据格式说明符解析,类似于scanf,但它是从一个字符串中而不是从标准输入读取数据。

#include <stdio.h>int main() {const char *input = "John Doe, 30"; // 假定这是我们要解析的字符串char name[20]; // 用于存放姓名的缓冲区int age; // 用于存放年龄的变量// 使用sscanf解析字符串// 注意逗号和空格在格式字符串中的处理,以及age前的*用于跳过无关字符int itemsScanned = sscanf(input, "%[^,], %d", name, &age);if (itemsScanned == 2) { // 检查是否成功解析了两个项目printf("Name: %s, Age: %d\n", name, age);} else {printf("Failed to parse the input string.\n");}return 0;
}

2.11 fseek

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.4 rewind

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.4 ftell

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

3. 缓存

3.1 全缓存

3.2 行缓存

3.3 不缓存

3.4 setvbuf

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

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

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

相关文章

抓住时机的核心:坚持学习准备着

在这个快节奏的时代&#xff0c;时间对于每个人来说都是宝贵的。能否在合适的时间做正确的事情&#xff0c;往往决定了我们成功的概率。但同时&#xff0c;我们也要认识到&#xff0c;逆风翻盘虽少&#xff0c;却并非不可能。在这个过程中&#xff0c;投资自己&#xff0c;投资…

LabVIEW与Python的比较及联合开发

LabVIEW和Python在工业自动化和数据处理领域各具优势&#xff0c;联合开发可以充分发挥两者的优点。本文将从语言特性、开发效率、应用场景等多个角度进行比较&#xff0c;并详细介绍如何实现LabVIEW与Python的联合开发。 语言特性 LabVIEW 图形化编程&#xff1a;LabVIEW使用…

【数据结构】队列的应用(详解)

目录 0 引言 1 打印机任务队列 2 广度优先搜索&#xff08;BFS&#xff09; 3 总结 0 引言 队列&#xff08;Queue&#xff09;是一种先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;它允许在尾部添加元素&#xff08;入队操作&#xff09;&#xff0c;并…

三维地图Cesium,加载一个模型,模型沿着给定的一组经纬度路线移动

目录 实现效果 实现思路 功能点 选择移动路线 加载模型和移动路线 重新运行 指定位置(经纬度点)开始移动 视角切换 到站提示 运行 停止 联动接口 完整代码 html js逻辑 trainOperation.js sourceData.js gitee仓库项目代码 疑问解答 实现效果 三维地图Cesiu…

CopyOnWriteArrayList详解

目录 CopyOnWriteArrayList详解1、CopyOnWriteArrayList简介2、如何理解"写时复制"3、CopyOnWriteArrayList的继承体系4、CopyOnWriteArrayList的构造函数5、CopyOnWriteArrayList的使用示例6、CopyOnWriteArrayList 的 add方法7、CopyOnWriteArrayList弱一致性的体现…

LeetCode790多米诺和托米诺平铺

题目描述 有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如 “L” 的托米诺形。两种形状都可以旋转。给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺…

Android基础-binder机制

一、引言 在Android系统中&#xff0c;进程间的通信&#xff08;IPC&#xff09;是一个至关重要的概念。不同于传统操作系统中的进程间通信方式&#xff0c;如管道、消息队列、信号量、共享内存等&#xff0c;Android采用了独特的Binder机制来实现进程间的通信。Binder机制不仅…

Qt 读取excel文件

在Qt中&#xff0c;你可以使用QtXlsxWriter库来对Excel文件进行操作。QtXlsxWriter是一个开源库&#xff0c;用于在Qt应用程序中生成和编辑Excel文件。以下是如何使用QtXlsxWriter库在Qt中对Excel文件进行操作的步骤&#xff1a; 添加QtXlsxWriter库到你的Qt项目中。可以通过在…

先进封装技术的一些优缺点探讨

半导体封装技术是半导体制造过程中的关键环节&#xff0c;它不仅保护了芯片免受物理损伤&#xff0c;还提供了电气连接和散热功能。随着技术的发展&#xff0c;出现了多种先进的封装技术&#xff0c;每种技术都有其特定的应用场景和优缺点。 --> 1. 传统封装技术 【优点】&…

【SpringBoot + Vue 尚庭公寓实战】根据类型查询标签列表接口实现(五)

【SpringBoot Vue 尚庭公寓实战】根据类型查询标签列表接口实现&#xff08;五&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】根据类型查询标签列表接口实现&#xff08;五&#xff09;1、查看接口2、进行开发 1、查看接口 启动项目 访问&#xff1a;http://localho…

macOS优化工具CleanMyMac2024免费版电脑性能提升 存储空间释放 电脑维护 高效易用 延长电脑使用寿命

【CleanMyMac】是一款专为macOS系统设计的优化和清理软件&#xff0c;它的核心特性就是帮助我们提升电脑性能&#xff0c;释放存储空间。&#x1f680; CleanMyMac绿色免费版下载如下&#xff1a;记得保存哈&#xff0c;以防失效&#xff1a; https://pan.quark.cn/s/9b08114…

实战分析Java的异步编程,并通过CompletableFuture进行高效调优

一、写在开头 在我们一开始讲多线程的时候,提到过异步与同步的概念,这里面我们再回顾一下: 同步:调用方在调用某个方法后,等待被调用方返回结果;调用方在取得被调用方的返回值后,再继续运行。调用方顺序执行,同步等待被调用方的返回值,这就是阻塞式调用;异步:调用方…

HTML标签 label for 还是 htmlFor

文章目录 问题结论更多 问题 HTML标签&#xff1a; label 的属性 for 还是 htmlFor&#xff1f; MDN文档&#xff1a;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label 结论 for 和 htmlFor 都可以使用&#xff0c;都是对的。在部分情况中&#xff0c;只能…

【React】Redux与React - 环境准备

配套工具 在React中使用redux&#xff0c;官方要求安装俩个其他插件 - Redux Toolkit 和 react-redux 配置基础环境 使用 CRA 快速创建 React 项目 npx create-react-app react-redux安装配套工具 npm i reduxjs/toolkit react-redux启动项目 npm run start

计算机网络复习题

期末题库复习1 一. 单选题&#xff08;共32题&#xff0c;100分&#xff09; 1. (单选题) 在脉冲起始时刻&#xff0c;有无跳变来表示“0”和“1”&#xff0c;且在脉冲中间时刻始终发生跳变的编码是&#xff08; &#xff09;。 A.非归零码 B.曼彻斯特编码 C.归零码 D.差…

解决更新Android Studio后下载Gradle超时

随着Android Studio的更新&#xff0c;所需要的最低Gradle版本也在变化&#xff0c;这时候构建项目的时候就需要先下载所需的Gradle发行版。对于Gradle构建项目&#xff0c;我们已经知道项目使用的Gradle是在根项目的gradle/wrapper/gradle-wrapper.properties文件中定义的&…

物联网设计竞赛_8_Jetson Orin Nano安装pytorch与torchvision

我的新板子到了&#xff0c;型号是jetson orin Nano与之前的jetson nano稍有不同我发现库又得从新下载 我的pip3的版本是3.8.10&#xff0c;jetpack版本5.1.1&#xff0c;又得重新开始下载库&#x1f62d; 安装pytorch: 得科学上网&#xff1a; PyTorch for Jetson - Jetson …

【RAG入门教程03】Langchian框架-文档加载

Langchain 使用文档加载器从各种来源获取信息并准备处理。这些加载器充当数据连接器&#xff0c;获取信息并将其转换为 Langchain 可以理解的格式。 LangChain 中有几十个文档加载器&#xff0c;可以在这查看https://python.langchain.com/v0.2/docs/integrations/document_lo…

android 双屏异显-学习笔记

双屏异显 日常生活中,有时候会遇到 Android 设备连接两个屏幕进行显示的问题,比如酒店登记信息时,一个屏幕用于员工操作,一个屏幕显示相关信息供顾客查看。这里就涉及到 Android 的双屏异显的问题,实现Android 的双屏异显,Google 也提供了相应的 API方法 Presentation。…

链表实现例子

链表概述 链表是一种基础的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。这些链表的实现展示了如何添加、删除和搜索节点,以及如何显示链表中的所有节点。根据具体需求,可以选择适合的链表类型。单向链表:每个节点只包含指向下一个节点的指针。双…