IO进程day02(文件IO)

news2024/12/24 0:04:35

目录

【1】什么是文件IO

1》概念

2》特点

3》操作

【2】函数接口

1》打开文件open()

思考:文件IO和标准IO的打开方式的对应关系

2》关闭文件 close()

 3》读写文件  read  write

1> 读文件 read()

2> 写文件 write() 

练习:文件IO实现cp功能。cp 源文件 新文件名

4》文件定位操作 lseek

练习:向文件中第 10 位置后面写一个字符,在文件此时的位置,往后移动20个位置处,写一行字符串hello进去,求此时文件的长度。

练习: 实现“head -n 文件名”命令的功能


【1】什么是文件IO

1》概念

又称系统IO,是系统调用,是操作系统提供的接口函数。

posix中定义的一组用于输入输出的函数。

POSIX接口 (英语:Portable Operating System Interface)可移植操作系统接口

2》特点

  1. 没有缓冲机制,每次都会引起系统调用。
  2. 围绕文件描述符进行操作,非负整数(>=0),依次分配。
  3. 文件IO默认打开三个文件描述符,分别是0(标准输入)、1(标准输出)和2(标准错误)。
  4. 操作除了目录d以外任意类型的文件b c - l s p
  5. 可移植性相对较差

3》操作

文件文件:open

关闭文件: close

读写操作: read和write

定位操作:lseek

【2】函数接口

1》打开文件open()

man 2 open

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

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

功能:打开文件

参数:pathname:文件路径名

flags:打开文件的方式

     O_RDONLY:只读

     O_WRONLY:只写

     O_RDWR:可读可写

     O_CREAT:不存在创建

     O_TRUNC:存在清空

     O_APPEND:追加

返回值:成功:文件描述符

失败:-1

当第二个参数中有O_CREAT选项时,需要给open函数传递第三个参数,指定创建文件的权限

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

最后权限 = mode &(~umask)

例如:指定权限为06668进制)

最终权限= 0666 & (~umask) = 0666 &(~0002) = 664

666 => 110 110 110

&775 111 111 101

664 110 110 100

 

思考:文件IO和标准IO的打开方式的对应关系

标准IO文件IO
r

O_RDONLY

只读

r+

O_RDWR

可读可写

w

O_WRONLY | O_CREAT | O_TRUNC, 0777

只写不存在创建存在清空

w+

O_RDWR | O_CREAT | O_TRUNC, 0777

可读可写不存在创建存在清空

a

O_WRONLY | O_CREAT | O_APPEND, 0777

只写存在创建存在追加

a+

O_RDWR | O_CREAT | O_APPEND, 0777

可读可写,存在创建存在追加

2》关闭文件 close()

#include <unistd.h>

int close(int fd);

功能:关闭文件

参数:fd:文件描述符

 3》读写文件  read  write

1> 读文件 read()

ssize_t read(int fd, void *buf, size_t count);

功能:从一个已打开的可读文件中读取数据

参数: fd 文件描述符

            buf 存放位置

            count 期望的个数

返回值:成功:实际读到的个数(小于期望值说明实际没这么多)

返回0:表示读到文件结尾

返回-1:表示出错,并设置errno号

fgetc -> EOF 末尾失败

fgets -> NULL 末尾失败

fread -> 0 末尾失败

read -> 0末尾 -1失败

2> 写文件 write() 

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

功能:向指定文件描述符中,写入 count个字节的数据。

参数:fd 文件描述符

           buf 要写的内容

           count 期望写入字节数

返回值:成功:实际写入数据的个数

失败 : -1

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

int main(int argc, char const *argv[])
{
    int fd;
    char buf[32] = "";
    //1.打开文件
    fd = open("a.c", O_RDWR); //r+
    if (fd < 0)
    {
        perror("open err ");
        return -1;
    }
    printf("fd: %d\n", fd);

    //2. 读写文件
    read(fd, buf, 10); //文件中内容为:hello
    printf("%s\n", buf); //hello

    write(fd, "world", 5);//向文件中写 world

    //3.关闭文件
    close(fd);
    return 0;
}
练习:文件IO实现cp功能。cp 源文件 新文件名
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    int fd1, fd2;
    if (argc != 3)
    {
        printf("err: %s <srcfile> <destfile>\n", argv[0]);
        return -1;
    }

    //1.打开两个文件
    fd1 = open(argv[1], O_RDONLY);
    if (fd1 < 0)
    {
        perror("fd1 open err");
        return -1;
    }
    fd2 = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0777);
    if (fd2 < 0)
    {
        perror("fd2 open err");
        return -1;
    }

    //2.循环读源文件,只要读到就写入目标
    char buf[32] = "";
    ssize_t n;
    while ((n = read(fd1, buf, 32)) > 0)
        write(fd2, buf, n);
    
    //while (read(fd1, buf, 1) > 0)  //或者
    //    write(fd2, buf, 1);

    //3. 关闭两个文件
    close(fd1);
    close(fd2);

    return 0;
}

4》文件定位操作 lseek

off_t lseek(int fd, off_t offset, int whence);

功能:设定文件的偏移位置

参数:fd:文件描述符

           offset: 偏移量

正数:向文件结尾位置移动

负数:向文件开始位置

            whence: 相对位置

                            SEEK_SET 开始位置

                            SEEK_CUR 当前位置

                            SEEK_END 结尾位置

补充:和fseek一样其中SEEK_SET,SEEK_CURSEEK_END和依次为012.

返回值:成功:文件的当前位置

失败:-1

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

int main(int argc, char const *argv[])
{
    int fd;

    fd = open("a.c", O_RDWR);
    if (fd < 0)
    {
        perror("open err");
        return -1;
    }

    //离开头后10个
    lseek(fd, 10, SEEK_SET);
    write(fd, "k", 1);//在该位置写个 k

    off_t off = lseek(fd, 0, SEEK_END);//记录文件长度
    printf("%ld\n", off);

    return 0;
}
练习:向文件中第 10 位置后面写一个字符,在文件此时的位置,往后移动20个位置处,写一行字符串hello进去,求此时文件的长度。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    int fd;

    fd = open("a.c", O_RDWR);
    if (fd < 0)
    {
        perror("open err");
        return -1;
    }

    lseek(fd, 10, SEEK_SET);//从头向后移动10个单位
    write(fd, "d", 1);

    lseek(fd, 20, SEEK_CUR);//从当前位置向后移动20各单位
    write(fd, "hello", 5);

    off_t off = lseek(fd, 0, SEEK_END);//计算从头到尾的长度
    printf("%ld\n", off);

    return 0;
}
练习: 实现“head -n 文件名”命令的功能
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    if (argc != 3)
    {
        printf("err: %s -n <filename>\n", argv[0]); //./a.out -n <filename>
        return -1;
    }

    FILE *fp = fopen(argv[2], "r");
    if (fp == NULL)
    {
        perror("fopen err");
        return -1;
    }

    //获取行数
    int num = atoi(argv[1] + 1); // +1是为了向后偏移一个地址单位把-去掉获取到要打印的行数

    char buf[32] = "";
    int len = 0;

    //循环读,然后数换行,打印到终端,如果是最后一行就退出
    while (fgets(buf, 32, fp) != NULL)
    {
        if (buf[strlen(buf) - 1] == '\n')     //数换行
            len++;

        if (len > num)    //达到行数就退出
            break;

        fputs(buf, stdout); //打印内容到终端
    }
    fclose(fp);
    return 0;
}

今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!

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

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

相关文章

使用AWS的EC2服务如何降低成本

在现代企业中&#xff0c;云计算已经成为推动业务创新和发展的重要工具。亚马逊云服务&#xff08;AWS&#xff09;的弹性计算云&#xff08;EC2&#xff09;提供了灵活的计算能力&#xff0c;企业可以根据需求快速部署和管理应用。然而&#xff0c;如何在使用EC2服务的过程中有…

无人机之多旋翼无人机的用途

一、航拍与摄影 高清摄像&#xff1a;多旋翼无人机搭载高清摄像头&#xff0c;可以进行高空拍摄&#xff0c;获取清晰的图像和视频资料&#xff0c;广泛应用于影视制作和新闻报道。 实时传输&#xff1a;无人机可通过图像传输设备&#xff0c;实现实时画面回传&#xff0c;为…

linux常见基础命令

Linux基础命令 (下面这些命令都是最常见的命令.更复杂的会在之后的C语言学习陆续深入) 1、 pwd 功能&#xff1a; print work directory的缩写&#xff0c;显示当前目录的绝对路径 2、 cd 功能&#xff1a; change directory的缩写&#xff0c;切换目录 绝对路径&#xff1a;以…

知识改变命运 数据结构【二叉树OJ题】

1. 检查两颗树是否相同OJ链接 class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if(pnull&&q!null||p!null&&qnull) {return false;}if (pnull&&qnull) {return true;}if (p.val!q.val) {return false;}boolean leftisSameTree(p.…

数据库内容保密检查系统:及时发现“潜在”安全威胁

日前&#xff0c;国内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全产品解决方案与相关技术研究开发的领军企业——国联易安自主研发的国联数据库内容保密检查系统V1.0通过国保局涉密检测&#xff0c;获得涉密信息系统产品检测证书。其主要具备以下主…

nginx访问控制,用户认证,https

nginx访问控制 用于location段Allow&#xff1a;设定允许哪台或哪些主机访问&#xff0c;多个参数间用空格隔开Deny&#xff1a;设定禁止那台或哪些主机访问&#xff0c;多个参数间用空格隔开比如&#xff1a;allow 192.168.100.20 192.168.100.30;deny all;拒绝某台主机访问…

JavaEE 第18节 TCPUDP优缺点(对比)

目录 前言1、UDP(User Datagram Protocol)优点缺点 2、TCP(Transmission Control Protocol)优点缺点 3、总结 前言 基于TCP/IP协议栈&#xff0c;TCP和UDP属于传输层协议。在Java生态中也分别提供了相关套接字&#xff08;Socket&#xff09;1的API&#xff0c;方便网络编程。…

基于OpenCV+MFC的KCF测速软件

基于OpenCVMFC的KCF测速软件 引言原理介绍使用介绍&#xff08;1&#xff09;主界面&#xff08;2&#xff09;打开视频&#xff08;3&#xff09;点击KCF测速&#xff08;4&#xff09;框选待检测目标&#xff08;5&#xff09;测速结果 资源链接&#xff08;包含源码&#xf…

How do I do function calling in Azure Openai using the javascript sdk

题意&#xff1a;如何使用 JavaScript SDK 在 Azure OpenAI 中进行函数调用&#xff1f; 问题背景&#xff1a; I want to be able to call functions based on the user input, I could do this with the openai library but cant find a way to do so in the azure openai l…

uniapp中$off没写正确引发的问题~

你们好&#xff0c;我是金金金。 场景 我正在使用uniapp开发微信小程序&#xff0c;涉及到几个页面之间的事件通信&#xff0c;采用的是uniapp里面的$on和&off来达到页面之间的互相通信功能如下&#xff1a;有一个选择城市的页面&#xff0c;当选择了某个城市&#xff0c;另…

树数据结构(Tree Data Structures)的全面指南:深度解析、算法实战与应用案例

树数据结构&#xff08;Tree Data Structures&#xff09;的全面指南&#xff1a;深度解析、算法实战与应用案例 引言 树数据结构&#xff08;Tree Data Structures&#xff09;作为计算机科学中的基石之一&#xff0c;以其独特的层次结构和分支特性&#xff0c;在众多领域发…

Hive SQL

一、基本数据类型 tinyint 1byte 有符号整数 smallint 2byte 有符号整数 int 4byte 有符号整数 bigint 8byte 有符号整数 boolean 布尔类型&#xff0c;true或者false float 单精度浮点数 double 双精度浮点数 decim…

系统数据迁移脱敏方案(word)

数据脱敏工作不仅要确保敏感信息被去除&#xff0c;还需要尽可能的平衡脱敏所花费的代价、使用方的业务需求等多个因素。因此&#xff0c;为了确保数据脱敏的过程、代价可控&#xff0c;得到的结果正确且满足业务需要&#xff0c;在实施数据脱敏时&#xff0c;应从技术和管理两…

stm32之I2C通信协议

文章目录 前言一、I2C通信协议二、I2C硬件电路三、I2C时序基本单元3.1 起始与终止信号3.2 发送与接收一个字节3.3 发送与接收应答 四、I2C时序分析4.1 指定地址写4.2 当前地址读4.3 指定地址读 前言 提示&#xff1a;本文主要用作在学习江科大自化协STM32入门教程后做的归纳总…

刷机维修进阶教程-----紫光展讯芯片修改参数 修复基带 信号的一种步骤解析【二】

上期解析了一款紫光芯片机型 改写参数的步骤。今天来讲解另外一款紫光新机型修改参数的具体步骤。同类紫光展讯 展锐芯片机型可以参考尝试 通过博文了解; 1---紫光芯片机型新款机型改写参数的步骤解析 2----了解同类芯片修改参数的常用步骤 3----列举一些紫光芯片机型开启…

OpenStack常见模块详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

“NoSQL数据库技术及其应用”写作框架,软考高级,系统架构设计师

论文真题 随着互联网web2.0网站的兴起&#xff0c;传统关系数据库在应对web2.0 网站&#xff0c;特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心&#xff0c;暴露了很多难以克服的问题&#xff0c;而非关系型的数据库则由于其本身的特点得到了非常迅速的发展…

Zookeeper的watch机制是如何工作的?

ZooKeeper Watch 概述 ZooKeeper Watch 机制类似于 Java 设计模式中的观察者模式或者监听模式&#xff0c;唯一的不同是不再基于线程间通信&#xff0c;而是基于进程间通信。 ZooKeeper Watch 机制是指&#xff0c;客户端在所有的读命令上告知服务端&#xff1a;这个节点或者…

windows 提权方式汇总

windows 提权 一、土豆&#xff08;potato&#xff09;家族提权 原理 土豆提权就是通过 windows 的 COM&#xff08;Component Object Model&#xff0c;组件对象模型&#xff09;类。向指定的服务器端口发送 NTLM 认证&#xff0c;捕获认证数据包&#xff0c;并修改数据包内…

【C++】—— 内存管理

【C】—— 内存管理 1 C/C 的内存划分 1.1 C/C 的内存分布1.2 C/C 的内存分布练习 2 C语言 中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3 C 内存管理方式3.1 new / delete 操作内置类型3.2 new 和 delete 操作自定义类型3.2.1 new 和 delete 操作自定义类型基础…