系统IO函数接口

目录

前言

一. man手册

1.1 man手册如何查询

1.2 man手册基础

二.系统IO函数接口

三.open打开文件夹

3.1 例1 open打开文件

3.2 open打开文件代码

3.3 例2 创建文件

四.write写文件

4.1 write写文件

五. read读文件

5.1 read读文件与偏移

5.2 偏移细节

5.3 read读文件代码

六.复制文件

6.1 方法1:cp 命令

6.2 方法2:使用缓冲区拷贝

6.3 方法3:主函数传参


前言

学习使用man手册,系统IO接口:open write read接口

系统I/O接口是一组用于处理输入和输出操作的函数和工具。这些接口提供了与操作系统交互的机制,允许程序读写文件、网络通信、控制设备等。系统I/O接口在C语言程序中扮演着至关重要的角色,以下是它们的一些主要作用:

一. man手册

1.1 man手册如何查询

我们输入man -f open 命令

man -f open

输入man man

可以查看man中的9本手册

1.2 man手册基础

当前第二本手册

函数的功能介绍(使用说明)

返回值介绍

错误号码

二.系统IO函数接口

在C语言中,系统I/O接口是一组用于处理输入和输出操作的函数和工具。这些接口提供了与操作系统交互的机制,允许程序读写文件、网络通信、控制设备等。系统I/O接口在C语言程序中扮演着至关重要的角色,以下是它们的一些主要作用:

  1. 文件操作: 系统I/O接口提供了一系列的函数,如 openreadwriteclose 等,用于打开、读取、写入和关闭文件。这些函数是进行文件处理的基础,允许程序访问磁盘上的文件资源。

  2. 数据传输: 通过系统I/O接口,程序可以读写数据流。这包括从标准输入(如键盘)读取数据,以及向标准输出(如终端或文件)写入数据。这些操作对于用户交互和程序输出是必不可少的。

  3. 缓冲管理: 系统I/O接口通常使用缓冲区来优化读写操作的性能。例如,stdio 库中的 freadfwrite 函数会在内部使用缓冲区来减少对底层 readwrite 系统调用的频繁使用。这有助于提高I/O操作的效率。

  4. 错误处理: 系统I/O接口提供了错误检测和报告机制。当I/O操作失败时,这些接口会设置全局变量 errno,并返回特定的错误代码。这使得程序员能够诊断和处理I/O操作中出现的问题。

  5. 设备控制: 系统I/O接口允许程序与各种设备进行交互,如打印机、磁盘驱动器、网络接口等。通过这些接口,程序可以执行设备特定的操作,如打开设备、发送命令、读取状态等。

  6. 网络通信: 系统I/O接口提供了网络编程的基础设施,包括套接字(sockets)操作、网络协议处理、数据包发送和接收等。这些接口使得程序能够在网络上进行通信和数据交换。

  7. 多线程和异步I/O: 在多线程或异步I/O环境中,系统I/O接口可以支持并发操作,允许多个线程同时进行I/O操作,提高了程序的响应性和性能。

  8. 跨平台兼容性: C语言标准库中的I/O接口设计为跨平台兼容,这意味着在不同的操作系统和硬件平台上,程序可以使用相同的I/O函数进行开发。这大大简化了程序的移植和维护工作。

总之,系统I/O接口是C语言程序与外部世界交互的桥梁,它们为程序提供了丰富的输入输出功能,使得程序能够执行文件处理、网络通信、设备控制等多样化的任务。通过有效地使用这些接口,程序员可以构建出功能强大、性能优越的应用程序。

三.open打开文件夹

3.1 例1 open打开文件

头文件

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

定义函数

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);

参数分析

需要注意:

3.2 open打开文件代码

代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>int main(int argc, char const *argv[])
{// 打开文件int  file_fd = open("abc.c",  O_RDONLY );if( -1 == file_fd ){fprintf( stderr , "open abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf("open abc.c succeed , file descriptor : %d \n " , file_fd);}return 0;
}

如果没有创建文件,则会显示文件或路径不存在

接着我们创建文件abc.c再进行测试,现在就可以找到文件了

3.3 例2 创建文件

如果文件不存在如何在程序中自行创建

可以先查看umask

当前测试文件夹中的内容为open_1.c

open_1.c代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>int main(int argc, char const *argv[])
{// 打开文件int  file_fd = open("abc.c",  O_RDONLY | O_CREAT | O_TRUNC , 0666 );if( -1 == file_fd ){fprintf( stderr , "open abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf("open abc.c succeed , file descriptor : %d \n " , file_fd);}return 0;
}

运行结果:可以看出编译a.out后,我们创建了一个名为abc.c的文件

四.write写文件

4.1 write写文件

在文件中写入

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>int main(int argc, char const *argv[])
{// 打开文件int  file_fd = open("abc.c",  O_RDWR | O_CREAT | O_TRUNC , 0666 );if( -1 == file_fd ){fprintf( stderr , "open abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf("open abc.c succeed , file descriptor : %d \n " , file_fd);}// 写入内容ssize_t ret_val = write ( file_fd , "Hello GZ2123", sizeof("Hello GZ2123"));if( -1 == ret_val ){fprintf( stderr , "write abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf(" write succeed : %ld byet \n" , ret_val);}while(1){}return 0;
}

五. read读文件

5.1 read读文件与偏移

在读取文件中,我们需要注意偏移量的细节

读取文件

移动文件的读写位置(设置偏移量)

5.2 偏移细节

读取文件时,需要注意当前文件的操作:

若打开进行写入操作后没有关闭,那么我们进行读操作时,偏移量会到数据末尾,如这里的null,若在这里进行读取数据,则读不出来:

解决方法:1.把文件关闭再打开,再次被打开时文件的偏移量为开头部分,这是就可以正常读取数据了

close(file_fd);
open("abc.c", O_RDWR, 0666 );

解决方法2:设置偏移量:通过直接设置偏移量,即可重现定位到文件的头部分

//把读写位置偏移到开头
ret_val = lseek(file_fd , 0 , SEEK_SET );       
printf("偏移后:%ld\n" , ret_val);

5.3 read读文件代码

代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>int main(int argc, char const *argv[])
{// 打开文件int  file_fd = open("abc.c",  O_RDWR | O_CREAT | O_TRUNC , 0666 );if( -1 == file_fd ){fprintf( stderr , "open abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf("open abc.c succeed , file descriptor : %d \n " , file_fd);}// 写入内容char str1[] = "hello word hello FFFF ello111222";//ssize_t ret_val = write ( file_fd , "Hello GZ2123", sizeof("Hello GZ2123"));ssize_t ret_val = write ( file_fd , str1, sizeof(str1));if( -1 == ret_val ){fprintf( stderr , "write abc.c error , msg:%s\n", strerror(errno));return -1 ;}else{printf(" write succeed : %ld byet \n" , ret_val);}//这里不使用偏移函数,使用关闭再打开文件也同样可以进行读取操作//重新打开文件,读写的偏移位自动为开头// close(file_fd);// open("abc.c", O_RDWR, 0666 );//把读写位置偏移到开头ret_val = lseek(file_fd , 0 , SEEK_SET );       printf("偏移后:%ld\n" , ret_val);//读取文件的内容char msg [128] ; // 设置一个用户缓冲区bzero(msg, sizeof(msg) ); // 清空内存区ret_val = read( file_fd , msg , sizeof(msg) );if(-1 == ret_val ){perror("读取文件失败");return -1 ;}else{printf("成功%ld字节 , 内容为:%s\n" , ret_val , msg );}close(file_fd);return 0;
}

结果

六.复制文件

6.1 方法1:cp 命令

可以直接使用cp进行复制

cp open_1.c  a.txt1

6.2 方法2:使用缓冲区拷贝

这里使用缓冲区进行循环拷贝

代码为:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>#define     SRC_PATH    "./open_1.c"
#define     TAG_PATH    "a.txt"
#define     SIZE_MEM    128int main(int argc, char const *argv[])
{//打开两个文件int tag_fd = open( TAG_PATH , O_WRONLY | O_CREAT | O_TRUNC , 0666 ); // 以只写的权限申请打开文件if(-1 == tag_fd ){perror("拷贝的新文件a.txt出现问题\n");return -1 ;}int src_fd = open( SRC_PATH , O_RDONLY ); // 以只写的权限申请打开文件if(-1 == src_fd ){perror("原文件open_1.c打不开\n");return -1 ;}// 创建一个用户缓冲区char * msg = calloc(1, SIZE_MEM);if( NULL == msg ){perror("缓冲区容量异常");close(src_fd);close(tag_fd);return -1 ;}ssize_t ret_val = -1 ;do{// 读取文件c.txt  存入用户缓冲区中ret_val = read( src_fd , msg , SIZE_MEM );if( ret_val < 0 ){perror("读取文件异常");break ;}printf("读取到的字节:%ld\n" , ret_val);// 写入到文件中ret_val = write(tag_fd , msg , ret_val );printf("写入的字节:%ld\n" , ret_val);}while ( ret_val >= SIZE_MEM );// 关闭文件close(src_fd);close(tag_fd);return 0;
}

这里生成的a.txt为拷贝后的文件        

6.3 方法3:主函数传参

使用主函数

可以看出我们把read.c复制一份为Even.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>#define     SRC_PATH    "./open.c"
#define     TAG_PATH    "a.txt"
#define     SIZE_MEM    128// ./a.out   1.c  2.c 
int main(int argc, char const *argv[])
{if( argc != 3 ){printf("请输入正确的参数!!!\n");return -1 ;}//打开两个文件int tag_fd = open( argv[2] , O_WRONLY | O_CREAT | O_TRUNC , 0666 ); // 以只写的权限申请打开文件if(-1 == tag_fd ){perror("作业本找不到");return -1 ;}int src_fd = open( argv[1] , O_RDONLY ); // 以只写的权限申请打开文件if(-1 == src_fd ){perror("借不到作业本");return -1 ;}// 创建一个用户缓冲区char * msg = calloc(1, SIZE_MEM);if( NULL == msg ){perror("脑容量异常");close(src_fd);close(tag_fd);return -1 ;}ssize_t ret_val = -1 ;do{// 读取文件c.txt  存入用户缓冲区中ret_val = read( src_fd , msg , SIZE_MEM );if( ret_val < 0 ){perror("读取文件异常");break ;}printf("读取到的字节:%ld\n" , ret_val);// 写入到文件中ret_val = write(tag_fd , msg , ret_val );printf("写入的字节:%ld\n" , ret_val);}while ( ret_val >= SIZE_MEM );// 关闭文件close(src_fd);close(tag_fd);return 0;
}

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

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

相关文章

3.5网安学习第三阶段第五周回顾(个人学习记录使用)

本周重点 ①SSRF服务器端请求伪造 ②序列化和反序列化 ③Vaudit代码审计 本周主要内容 ①SSRF服务器端请求伪造 一、概述 SSRF: server site request forgery (服务器端请求伪造)。 SSR: 服务端请求&#xff0c;A服务器通过函数向B服务器发送请求。 SSRF发生的前提条件…

Flutter动画笔记---总结

三种情况&#xff1a;第一种情况&#xff1a;隐式动画&#xff0c;全自动动画&#xff08;属于内部封装好了&#xff0c;只需要几行代码&#xff0c;就可以实现非常强大的效果&#xff09;第二种情况&#xff1a;显示动画&#xff0c;手动控制的动画&#xff08;提供自定义选择…

【ARM 嵌入式 C 字符串系列 23 -- 返回从父字符串找到相同子字符串的个数】

请阅读【嵌入式开发学习必备专栏 】 文章目录 返回从父字符串找到相同子字符串的个数 返回从父字符串找到相同子字符串的个数 在 C 语言中&#xff0c;可以编写一个自定义函数来计算一个父字符串&#xff08;haystack&#xff09;中相同子字符串&#xff08;needle&#xff09…

蓝桥杯备考随手记: practise04

问题描述: 小明被不明势力劫持。后莫名其妙被扔到 X 星站再无问津。小明得知每天都有飞船飞往地球&#xff0c;但需要 1 元的船票&#xff0c;而他却身无分文。他决定在 X 星站打工。好心的老板答应包食宿&#xff0c;第 1 天给他 1 元钱。并且&#xff0c;以后的每一天都比前…

《QT实用小工具·三》偏3D风格的异型窗体

1、概述 源码放在文章末尾 可以在窗体中点击鼠标左键进行图片切换&#xff0c;项目提供了一些图片素材&#xff0c;整体风格偏向于3D类型&#xff0c;也可以根据需求自己放置不同的图片。 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; 头文件部分&#xff…

Linux安装Tomcat保姆级教程

文章目录 前言一、安装JDK二、Tomcat下载三、Tomcat安装1.创建Tomcat的安装目录2.切换到Tomcat的安装目录3.上传Tomcat安装包4.解压缩5.切换到安装好的tomcat的bin目录6.启动tomcat7.网络请求测试 四、外部电脑访问nginx设置方法一&#xff1a;关闭防火墙方法二&#xff1a;添加…

Java反射系列(3):从spring反射工具ReflectionUtils说起

目录 传送门 兼容性引发的"血案" ReflectionUtils的原理 目的有三 ReflectionUtils的API使用 Method getAllDeclaredMethods findMethod invokeMethod Field getDeclaredFields findField getField makeAccessible Constructor accessibleConstructo…

Spring IoCDI(2)

IoC详解 通过上面的案例, 我们已经知道了IoC和DI的基本操作, 接下来我们来系统地学习Spring IoC和DI的操作. 前面我们提到的IoC控制反转, 就是将对象的控制权交给Spring的IoC容器, 由IoC容器创建及管理对象. (也就是Bean的存储). Bean的存储 我们之前只讲到了Component注解…

SAP Fiori开发中的JavaScript基础知识10 - 变量作用域,变量提升

1. 背景 本文将会介绍JavaScript中两个相对复杂的概念&#xff0c;也即作用域和变量提升。这个概念在JavaScript中的设计和ABAP中的设计区别还是比较大的&#xff0c;特别是变量提升部分。第一次接触JavaScript的同学&#xff0c;要注意理解和区分。 2. 作用域 在JavaScript…

vscode安装

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x1f601; 喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა …

商场促销--策略模式

1.1 商场收银软件 package com.lhx.design.pattern.test;import java.util.Scanner;public class Test {public static void main(String[] args){System.out.println("**********************************************"); System.out.println("《大话设计模式…

vue3鼠标向下滑动,导航条改变背景颜色和logo的封装

代码中使用了element-plus组件&#xff0c;需先安装 向下滑动前 向下滑动后&#xff08;改变了logo 字体 背景颜色&#xff09; <script lang"ts" setup> import router from /router; import { ArrowDown } from element-plus/icons-vue import { ref, …

【tensorflow框架神经网络实现鸢尾花分类—优化器】

文章目录 1、前言2、神经网络参数优化器2.1、SGD2.2、SGDM2.3、Adagrad2.4、RMSProp2.5、Adam 3、实验对比不同优化器4、结果对比 1、前言 此前&#xff0c;在【tensorflow框架神经网络实现鸢尾花分类】一文中使用梯度下降算法SGD&#xff0c;对权重 w w w和偏置 b b b进行更新…

如何在Windows上安装SSH

SSH&#xff08;Secure Shell&#xff09;协议是一种强大且安全的网络协议&#xff0c;它为用户提供了一种加密的方式来远程访问和管理终端设备。在Windows操作系统中&#xff0c;安装和配置SSH服务是一个相对直接的过程&#xff0c;可以让你享受到SSH带来的便利和安全性。下面…

软件设计原则:迪米特法则

定义 迪米特法则&#xff08;Law of Demeter, LoD&#xff09;&#xff0c;又称最少知识原则&#xff0c;它指导我们在设计软件时&#xff0c;应当尽量减少对象之间的交互&#xff0c;一个对象应该对其他对象有尽可能少的了解。具体来说&#xff0c;一个对象应该只调用属于以下…

Lua脚本的使用

一、使用lua脚本扣减单个商品的库存 SpringBootTest class LuaTests {AutowiredStringRedisTemplate stringRedisTemplate;Testvoid test3() {for (int i 1; i < 5; i) {stringRedisTemplate.opsForValue().set("product."i,String.valueOf(i));}}Testvoid test…

3.写一个char类型的字符数组,对该数组访问越界时抛出异常,并做处理。

#include <iostream>using namespace std;char arr[10]"12345678"; void show(int i) {if(i>10){throw int(2);}cout << arr[i] <<endl; } int main() {int i;cin >> i;try {show(i);} catch (int) {cout << "越界" <…

【华为OD机试C++】句子逆序

《最新华为OD机试题目带答案解析》:最新华为OD机试题目带答案解析,语言包括C、C++、Python、Java、JavaScript等。订阅专栏,获取专栏内所有文章阅读权限,持续同步更新! 文章目录 描述输入描述输出描述示例1示例2代码描述 将一个英文语句以单词为单位逆序排放。例如“I am …

【Web】记录Polar靶场<困难>难度题一遍过

目录 上传 PHP是世界上最好的语言 非常好绕的命令执行 这又是一个上传 网站被黑 flask_pin veryphp 毒鸡汤 upload tutu Unserialize_Escape 自由的文件上传系统​​​​​​​ ezjava 苦海 你想逃也逃不掉 safe_include CB链 phar PHP_Deserializatio…

Centos7环境下安装MySQL8详细教程

1、下载mysql安装包 2、检查是否安装过mysql ps:因为以前用yum安装过&#xff0c;所以先用yum卸载。如果不是此方式或者没安装过则跳过 [rootlocalhost ~]# yum remove mysql 已加载插件&#xff1a;fastestmirror 参数 mysql 没有匹配 不删除任何软件包 查看是否有mysql依赖 …