系统IO函数接口

news2024/11/23 12:09:30

目录

前言

一. 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    128


int 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.coloradmin.cn/o/1564945.html

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

相关文章

1,static 关键字.Java

目录 1.概述 2.定义格式和使用 2.1 静态变量及其访问 2.2 实例变量及其访问 2.3 静态方法及其访问 2.4 实例方法及其访问 3.小结 1.概述 static表示静态&#xff0c;是Java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。被static修饰后的&#xff…

STM32CubeMX配置步骤详解零 —— 引言

引子 初识 笔者接触STM32系列MCU有些年头了。初次接触是2015年&#xff0c;那时是在第二空间&#xff08;北京&#xff09;科技有限公司上班&#xff0c;是以STM32F407&#xff08;后缀好像是RGT6或ZGT6&#xff0c;记得不是很清楚了&#xff09;为主芯片做VR头戴式设备&…

40道Java经典面试题总结

1、在 Java 中&#xff0c;什么时候用重载&#xff0c;什么时候用重写&#xff1f; &#xff08;1&#xff09;重载是多态的集中体现&#xff0c;在类中&#xff0c;要以统一的方式处理不同类型数据的时候&#xff0c;可以用重载。 &#xff08;2&#xff09;重写的使用是建立…

githacker安装使用

githack下载不了文件&#xff0c;换个工具&#xff01; 项目地址 WangYihang/GitHacker: &#x1f577;️ A .git folder exploiting tool that is able to restore the entire Git repository, including stash, common branches and common tags. (github.com) 安装 pyth…

光伏行业项目管理系统解决方案!企智汇光伏项目管理系统!

光伏行业项目管理系统解决方案旨在通过整合和优化项目管理流程&#xff0c;提高光伏项目的执行效率和质量。以下是企智汇软件详细的光伏行业项目管理系统解决方案的框架&#xff1a; 一、系统概述 企智汇光伏行业项目管理系统是一个集项目规划、执行、监控和收尾于一体的综合…

Vue3:用Pinia的storeToRefs结构赋值store数据

一、情景描述 我们学习了Pinia之后&#xff0c;知道&#xff0c;数据是配置在Pinia的state里面的。 那么&#xff0c;如果有多个字段需要取出来使用&#xff0c;并且不丢失数据的响应式&#xff0c;如何优雅的操作了&#xff1f; 这里就用到了Pinia的storeToRefs函数 二、案…

【CANN训练营笔记】AscendCL图片分类应用(C++实现)

样例介绍 基于PyTorch框架的ResNet50模型&#xff0c;对*.jpg图片分类&#xff0c;输出各图片所属分类的编号、名称。 环境介绍 华为云AI1s CPU&#xff1a;Intel Xeon Gold 6278C CPU 2.60GHz 内存&#xff1a;8G NPU&#xff1a;Ascend 310 环境准备 下载驱动 wget ht…

CAPL实现关闭TCP连接的几种方式以及它们的区别

在讲正文前,我们有必要复习下关闭TCP连接的过程:四次挥手。 假设A和B建立TCP连接并进行数据传输,当A的数据发送完后,需要主动发起断开连接的请求: A发送FIN报文,发起断开连接的请求B收到FIN报文后,首先回复ACK确认报文B把自己的数据发送完,发送FIN报文,发起断开连接的…

探索网红系统功能菜单架构的设计与优化

随着社交媒体和数字化内容的普及&#xff0c;网红经济正在成为新兴的产业。在网红经济体系中&#xff0c;网红系统的功能菜单架构对于平台的用户体验和运营效率至关重要。本文将深入探讨网红系统功能菜单架构的设计与优化&#xff0c;为网红经济的发展提供新的思路和方法。 --…

HWOD:自守数

一、知识点 break只会结束最里面的一层循环 int型数按位比较的时候&#xff0c;可以直接求余比较&#xff0c;无需转换为char型数组后再按下标比较 二、题目 1、描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如&#xff1a;25^2 625&#xff0c;76^2 5776…

软考高级架构师:文件管理-位示图概念和例题

一、AI 讲解 文件管理在操作系统中负责文件的存储、检索、共享和保护。管理空闲空间是其中的一项重要任务&#xff0c;以确保文件系统的高效和灵活性。常见的空闲空间管理方法有空闲区表法、空闲链表法、位示图法和成组链表法。 下面通过表格形式概括这些方法的特点和应用场景…

Python快速入门系列-9(Python项目实战)

第九章:Python项目实战 9.1 开发一个简单的Web应用9.1.1 项目概述9.1.2 环境准备9.1.3 项目结构9.1.4 代码实现9.1.4.1 创建数据库模型9.1.4.2 创建视图9.1.4.3 实用工具函数9.1.4.4 运行应用9.1.5 模板设计9.2 数据分析与可视化项目9.2.1 项目概述9.2.2 环境准备9.2.3 数据分…

file_get_contents(‘php://input‘); 这个postman要如何传参

在 Postman 中传递参数给 file_get_contents(php://input); 是通过请求的 Body 部分来实现的。使用 Postman 进行 API 接口测试时&#xff0c;可以按照以下步骤来传递参数&#xff1a; 打开 Postman 并创建一个新的请求。在请求的 URL 地址栏输入你的 API 地址。选择请求方法为…

Spark实战:词频统计

文章目录 一、Spark实战&#xff1a;词频统计&#xff08;一&#xff09;Scala版1、分步完成词频统计2、一步搞定词频统计 &#xff08;二&#xff09;Python版1、分步完成词频统计2、一步搞定词频统计 二、实战总结 一、Spark实战&#xff1a;词频统计 &#xff08;一&#x…

【Python时序预测系列】基于ConvLSTM实现单变量时间序列预测(源码)

这是我的第252篇原创文章。 一、引言 ConvLSTM是一种融合了卷积神经网络&#xff08;CNN&#xff09;和长短期记忆网络&#xff08;LSTM&#xff09;的混合神经网络结构&#xff0c;专门用于处理时空序列数据。ConvLSTM结合了CNN对空间特征的提取和LSTM对时间序列建模的能力&a…

CentOS7安装flink1.17完全分布式

前提条件 准备三台CenOS7机器&#xff0c;主机名称&#xff0c;例如&#xff1a;node2&#xff0c;node3&#xff0c;node4 三台机器安装好jdk8&#xff0c;通常情况下&#xff0c;flink需要结合hadoop处理大数据问题&#xff0c;建议先安装hadoop&#xff0c;可参考 hadoop安…

曲线降采样之道格拉斯-普克算法Douglas–Peucker

曲线降采样之道格拉斯-普克算法Douglas–Peucker 该算法的目的是&#xff0c;给定一条由线段构成的曲线&#xff0c;找到一条点数较少的相似曲线&#xff0c;来近似描述原始的曲线&#xff0c;达到降低时间、空间复杂度和平滑曲线的目的。 附赠自动驾驶学习资料和量产经验&…

【C++】哈希之位图

目录 一、位图概念二、海量数据面试题 一、位图概念 假如有40亿个无重复且没有排序的无符号整数&#xff0c;给一个无符号整数&#xff0c;如何判断这个整数是否在这40亿个数中&#xff1f; 我们用以前的思路有这些&#xff1a; 把这40亿个数遍历一遍&#xff0c;直到找到为…

AI音乐GPT时刻来临:Suno 快速入门手册!

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

使用fusesource的mqtt-client-1.7-uber.jar,mqtt发布消息出去,接收端看到的是中文乱码,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…