自学嵌入式第十九天高级编程篇 文件2

news2024/11/25 3:04:47

标准IO的返回值判断 

        feof:判断文件流指针是否到达结尾。

                feof(src)        //如果文件流指针到达末尾,函数返回值为真

        ferror:判断文件流指针是否出错。搭配clearerr使用可以跳过报错的地方,读取后面的数据

                ferror(src)     //如果文件流指针出错,则函数返回值为真    

                clearerr(src) //跳过错误的空间

标准IO的文件定位:

        fseek

//函数原型

int feek(FILE * stream,long offset,int whence);

//参数:
//stream 要移动文件指针的目标文件流对象    注意:不支持设备文件,一般用于普通文件。
//offset 需要偏移的大小
//whence 从何处开始偏移    主要有以下的宏:
                            //SEEK_SET    文件开头
                            //SEEK_CUR    当前位置
                            //SEEK_END    文件结尾

        ftell

//函数原型
long ftell(FILE *stream);

//参数stream 文件流

//获取当前文件流指针的具体位置,一般以文件开头到当前指针的字节数为返回值

        rewind

//将文件流指针指向开头

void rewind(FILE * stream);

//可用fseek替代
fseek(fp,0,SEEK_SET);

缓冲区

        行缓冲,大小为1k(1024个字节),主要用于人机交互

                刷新条件:

                        1.遇到\n

                        2.缓冲区满刷新

                        3.程序结束

                        4.fflush刷新至屏幕上         fflush(stdout);

//补充,系统默认打开的文件流

stdin    //标准输入    数据从终端接收    搭配读取函数达到scanf的效果

stdout   //标准输出    数据输出到终端上    搭配写入函数达到printf的效果

stderr   //标准错误 

        全缓冲,大小为4k,主要用于文件的写操作 

                刷新条件:

                        1.缓冲区满

                        2.程序结束刷新

                        3.fflush来刷新        fflush(fp);

        无缓冲,大小为0,主要用于出错处理信息的输出        stderr

                不对数据缓存直接刷新

//程序报错写法

fprintf(stderr,"fopen error %s",filename);

流的分类

                文本流

                        在文本流中流动的数据是以字符的形式 流动

                二进制流

                         在二进制流中的数据是以二进制的形式流动的

文件IO

        操作系统为了方便用户使用系统功能而对外提供的一组函数 。称之为系统调用,其中有一个文件IO,一般都是对设备文件操作,当然也可以对普通文件进行操作。

        一个基于Linux内核的没有缓存的IO机制

        特性:

                1.没有缓冲区

                2.操作对象不再是流,而是文件描述符 int

                3.文件描述符是一个很小的非负的整数(0-1023),内核每打开一个文件,就会获得一个文件描述符。

                4.每个程序在启动的时候操作系统默认会认为其打开三个描述符。

//三个描述符与流对象的匹配
//描述符                       流对象
//0        STDIN_FILENO        stdin
//1        STDOUT_FILENO       stdout
//2        STDERR_FILENO       stderr

        相关函数

                open

int open(const char *pathname, int flags);    //函数原型

//参数:
//pathname    表示你想打开的文件的路径,是一个字符串
//flags       表示你想以什么模式打开该文件,系统提供了一些宏供你选择
            //常用的宏有  //O_RDONLY  只读
                         //O_WRONLY  只写
                         //O_RDWR    读写
                         //O_CREAT   创建    //使用该宏时,参数要加上权限
                         //O_TRUNC   打开时清除文件中原有的数据
                         //O_APPEND  打开时在文件最后的位置追加
//返回值    如果打开成功,返回一个文件描述符(int类型),失败则返回-1

                        使用实例:

                read

ssize_t read(int fd, void *buf, size_t count);    //函数原型

//参数
//fd    文件描述符
//buf   表示你要读到哪个地方,是一个地址
//count 表示你想要读多大的空间的内容

//返回值
//成功时返回实际读到的字节数,如果等于0,表示文件已经读到末尾,失败则返回-1; 

                        使用实例:

                write 

ssize_t write(int fd, const void *buf, size_t count);    //函数原型

//参数
//fd    文件描述符
//buf   表示你要写进文件的内容存放的地址
//count 表示你期望写入的大小    此时填写大小要慎重,需要是内容的有效长度

//返回值
//成功时会返回实际写入文件的字节数,失败则返回-1

                        使用实例:

        重点实例:用read和write完成对任意文件的复制

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main(int argc, const char *argv[])
{
	if (argc < 3)
	{
		fprintf(stderr,"input 2 pathname\n");
		return -1;
	}

	int fd_src = open(argv[1],O_RDONLY);    //源文件只读方式打开
	int fd_dest = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666);    //目标文件只写方式打开,文件不存在时创建,原有的内容也清除
                                                    //0666是该文件的权限

	if (fd_src == -1 || fd_dest == -1)    //任一文件描述符为-1,则打印错误信息
	{
		fprintf(stderr,"open error\n");
		return -1;
	}

	char buf[1024] = {0};    //在内存上开辟一块空间用来存放读写的内容,初始化为0

	while (1)
	{
		int ret = read(fd_src,buf,sizeof(buf));    //将源文件的内容读到buf中,且接收实际读到的字节数

		if (ret == 0)    //如果读到的字节数为0,表示已读到文件末尾,退出循环
		{
			break;
		}

		write(fd_dest,buf,ret);    //将buf中的内容写入目标文件,此时写入的长度是实际读到了的长度
	}

	close(fd_src);    //关闭两个文件
	close(fd_dest);
	
	return 0;
}

        lseek

off_t lseek(int fd, off_t offset, int whence);    //函数原型

//参数
//fd 文件描述符
//offset 偏移量
//whence 表示从何处开始偏移    系统提供的宏和fseek的一样

//返回值
//返回文件开头到当前位置的大小    相当于ftell

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

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

相关文章

短视频SDK解决方案,良好的二次开发可扩展性

短视频已成为当代社交与内容消费的重要载体&#xff0c;其影响力与日俱增&#xff0c;面对这一蓬勃发展的市场&#xff0c;如何高效、创新地打造短视频应用&#xff0c;成为众多开发者和企业的核心关切。在此背景下&#xff0c;美摄科技凭借其深厚的技术积累与前瞻性的市场洞察…

奇异值分解(SVD)

1 奇异值分解(SVD)简介 Beltrami 和 Jordan 被认为是奇异值分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;的共同开创者&#xff0c;二人于19世纪70年代相继提出了相关理论。奇异值分解主要解决的问题是数据降维。在高维度的数据中&#xff0c;数据…

什么是流批一体?怎样理解流批一体?

目录 一、流式处理与批量处理概述 1.流式处理 2.批量处理 3.流批一体的定义 二、流批一体的关键特点 三、流批一体的技术实现 四、应用场景 五、实施流批一体的考虑因素 流批一体听起来很简单&#xff0c;但内涵却十分复杂。它包含了计算语义、编程模型、API、调度、执行、shuf…

Halcon玩转机器视觉专栏特殊声明

欢迎来到 PaQiuQiu 的空间 本文为【Halcon玩转机器视觉专栏特殊声明】&#xff0c;方便大家更合理的订阅! &#x1f4e2; ~特殊声明~ 鉴于很多童鞋在订阅专栏过程中&#xff0c;对于专栏中涉及到的资料&#xff08;比如中文学习手册&#xff09;和源码&#xff08;C#联合Halco…

背包九讲(动态规划)

文章目录 01背包问题题目描述解题思路&#xff1a;上代码&#xff1a;思路2&#xff1a;二维代码&#xff1a;优化代码&#xff1a; 完全背包问题题目描述&#xff1a;解题思路&#xff1a;二维代码&#xff1a;优化代码&#xff1a; 多重背包问题题目描述&#xff1a;解题思路…

有趣的rce漏洞复现分析(1)

目录 eval长度限制突破 第一种方法 第二种方法 无字母数字webshell之命令执行 php7 php5 eval长度限制突破 php eval函数参数限制在16个字符的情况下&#xff0c;如何拿到webshell呢 首先&#xff0c;我们还是先把环境搭好&#xff08;此次的所有漏洞环境我都部署在Ubu…

MySQL的索引事务和JDBC编程

目录 索引 查看索引 创建索引 删除索引 底层数据结构&#xff08;这个很重要哦&#xff0c;面试容易问&#xff09; 事务 事务的使用 事务的基本特性 并发执行事务可能产生的问题 MySQL提供的四种事务隔离级别 JDBC编程 JDBC的来源&#xff08;一定要了解&#xff…

[WUSTCTF2020]颜值成绩查询

打开题目 输入1 输出 输入1会提示学号不存在 输入1/**/or/**/11#,过滤了空格。 1/**/order/**/by/**/3# 存在 1/**/order/**/by/**/4# 不存在 绕过 爆破表名 -1/**/Union/**/Select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/tabl…

8.1.数据库基础技术-数据库基本概念

数据库基本概念 数据库系统概述三级模式两级映射概念模式内模式外模式三级模式两级映像练习题 数据库设计练习题 数据库系统概述 数据&#xff1a;是数据库中存储的基本对象&#xff0c;是描述事物的符号记录。 数据的分类&#xff1a;文本、图形、图像、音频、视频。 数据库…

Unity动画模块 之 2D IK(反向动力学)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 1.什么是IK 反向动力学 IK&#xff08;Inverse Kinematics&#xff09;是一种方法&#xff0c;可以根据某些子关节的最…

C++初阶:内存管理详解

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 1.C/C内存分布 我们先来看下面一段代码和相…

Haproxy简介及配置详解

一、Haproxy简介 官网&#xff1a; 企业版网站: https://www.haproxy.com 社区版网站: http://www.haproxy.org github: https://github.com/haprox Haproxy是法国人Willy Tarreaus开发的一款开源软件&#xff0c;能够提供高性能、负载均衡以及基于HTTP和TCP应用个代理&…

微信自动回复的设置

如何在微信上高效回复客户&#xff0c;提供良好的用户体验是很重要的。 但常常因为一人管理太多号&#xff0c;消息回复不过来&#xff1b;同时太多客户咨询&#xff0c;手忙脚乱&#xff1b;回复的话术让人感到不专业。 没关系&#xff0c;小编有办法。给大家分享几个小技巧…

【聚类算法】

聚类算法是一种无监督学习方法&#xff0c;用于将数据集中的数据点自动分组到不同的类别中&#xff0c;这些类别也称为“簇”或“群”。聚类的目标是让同一簇内的数据点尽可能相似&#xff0c;而不同簇之间的数据点尽可能不相似。聚类算法广泛应用于多种领域&#xff0c;如数据…

NASA:ARCTAS_AircraftRemoteSensing_P3B_AATS14_Data

ARCTAS P-3B Aircraft AATS14 Data 简介 ARCTAS_AircraftRemoteSensing_P3B_AATS14_Data 包含在 "从飞机和卫星观测对流层成分的北极研究"&#xff08;ARCTAS&#xff09;任务期间通过 P-3B 飞机上的艾姆斯 14 通道机载跟踪太阳光度计&#xff08;AATS14&#xff0…

初始化React Native项目

node 版本 高于16版本会出现错误 Error: error:0308010C:digital envelope routines::unsupported (Node.js v19.4.0) openssl 3.0版本与node 版本不一致冲突 react-native 初始化项目版本为 镜像使用淘宝镜像源 npx nrm use taobao npx react-native0.67 init FirstApp …

vue 中使用 lodash Debounce防抖不生效

需求&#xff1a;搜索按钮增加防抖功能 代码1 <template><el-button type"primary" icon"el-icon-search" click"searchClick">搜索</el-button> </template><script> import { debounce } from "lodash&q…

使用Nvm切换nodeJs高版本之后,使用npm install一闪而过

先说现象,最近又有几个项目接手,其中有一个使用NVM切换至高版本node后,出现如下症状; 没有任何提示,然后翻看文件目录,node_modules目录没有创建,同时在全局 npm config set prefix 设置的目录下 多了一个 pgn的快捷,指向项目目录。 使用百度或者chart-gtp,搜索到的答案…

VSCODE ESP-IDF 内置 JTAG 接口断点单步调试笔记

环境配置 下载VSCODE之后&#xff0c;安装VSCODE的ESP-IDF插件。 还可安装c/c与python的语言插件 进行配置&#xff1a;ctrlshiftP 打开配置选项&#xff0c;输入ESP-IDF:Configure ESP-IDF extension 根据情况选择即可&#xff1a; 点击“Configure Tools” 出现…

echarts多条折线图,横轴相同问题

this.curveList [ { value: "5", collectTime: "13.14", signalName: "数据深" }, { value: "1", collectTime: "13.23", signalName: "数据深" }, { value: "20", collectTime: "13.14", s…