Linux Ubuntu下的文件IO介绍及实例应用(C语言)

2023-05-16

       大家好,我是练习编程时长两年半的个人练习生昆工第一ikun,昨天咋们说了标准IO,今天咋们来分享文件IO,以及一个很有趣的实例,给图片加密,使其无法打开。话不多说,上代码。


一、文件IO

文件IO遵循POSIX标准,文件IO实际上使用的系统调用函数

文件IO中通过文件描述符唯一标识一个文件

1、文件描述符

文件描述符是一个按顺序分配的最小的非负整数,当用户打开或者新建一个文件时,系统会向当前进程返回一个最小的可用的文件描述符。

三个特殊的文件描述符

标准输入 -- 0 -- stdin

标准输出 -- 1 -- stdout

标准错误 -- 2 -- stderr

2、文件相关系统调用函数

open、close -- 打开关闭文件

read、write -- 读写文件

lseek -- 文件定位

(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); 
  参数:
   pathname:打开文件的文件名(包含路径)
   flags:
       O_RDONLY: 以只读方式打开文件
       O_WRONLY: 以只写方式打开文件
       O_RDWR:以读写方式打开文件     前三个选项必须选择一个进行填写
       O_CREAT:当打开文件不存在时,用该选项创建新文件,并用第三个参数为其设置权限
       O_EXCL:一般和O_CREAT联合使用,用于检测文件是否存在
       O_APPEND: 以追加的方式打开文件,在文件末尾另起一行继续写入
       O_TRUNC:打开文件之后,会将原文件清空
   mode:
       当需要创建新文件时,需要用该参数给新建文件设置初始权限,一般设为0664;
      
  返回值:
   成功返回文件描述符,失败返回-1;


 

(2)关闭文件 -- close


   #include <unistd.h>
​
   int close(int fd);
   参数:
    fd:要关闭文件的文件描述符
   返回值:
    成功返回0,失败返回-1  

  (3)读写文件


   #include <unistd.h>
​
   ssize_t read(int fd, void *buf, size_t count);
   参数:
    fd:读取文件的文件描述符
    buf:用户自定义的缓冲区,用于存放读取的内容
    count:请求读取的字节数
  
   返回值:
    成功返回读取的字节数,失败返回-1,返回0表示读到文件末尾;  


   #include <unistd.h>
​
   ssize_t write(int fd, const void *buf, size_t count);
   参数:
    fd:读取文件的文件描述符
    buf:用户自定义的缓冲区,用于存放准备写入的内容
    count:请求写入的字节数
  
   返回值:
    成功返回写入的字节数,失败返回-1;     

(4)文件定位 -- lseek


   #include <sys/types.h>
   #include <unistd.h>
​
   off_t lseek(int fd, off_t offset, int whence);
   参数:
    fd:文件描述符
    offset:偏移量,可正可负
    whence:基准点
        SEEK_SET:定位在文件开头
        SEEK_CUR:定位在当前位置
        SEEK_END: 定位在文件末尾
   返回值:
    成功返回当前定位位置相对于文件开头的偏移量,失败返回-1  

二、实例

对图片进行加密解密操作

思路:

1、开打图片 -- open

2、读取图片的前10个字节 -- read

3、将读取的10个字节有序地打乱 -- (字符串倒序)

4、将文件指针重新定位在文件开头 -- lseek

5、将打乱的10个字节写入文件 -- write

6、关闭文件 -- close

代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{   
    int fd = open("cxk.jpg", O_RDWR);
    if(fd < 0)
    {
        perror("open");
        return -1;
    }
    char buf[64] = {0};
    char s[3];
    printf("请输入三位密码:\n");
    fgets(s, 3, stdin);
            
        read(fd, buf, 10);
        int i = 0, j = 9;
        while(i < j)
        {
            char t = buf[i];
            buf[i] = buf[j];
            buf[j] = t;
            i++;
            j--;
        }
        lseek(fd, 0, SEEK_SET);
        write(fd, buf, 10);
        printf("密码错误,文件已加密\n");
    return 0;
} 

运行程序,如下图:

       我们可以看到图片由于头部数据被破坏,所以已经无打开,我们再次运行程序将头部数据恢复,图片就能打开了。

 

 


今天分享的内容就到这了,我是练习编程时长两年半的个人练习生昆工第一ikun,咋们明天见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux Ubuntu下的文件IO介绍及实例应用(C语言) 的相关文章

随机推荐

  • C语言打印输出字符串的几种方法

    思路分析 知识点补充 1 xff0c 在C语言中 xff0c 一维数组的数组名实际上就是指向数组首项元素的指针 2 xff0c 如果指针p已经指向一个字符串 xff0c 判断字符串是否结束 xff0c 一般采用while p 61 39 0
  • 对‘fmt::v9::detail::throw_format_error(char const*)’未定义的引用

    在学习视觉SLAM十四讲第十二章的过程中 xff0c 尝试跑了一下单目稠密地图构建的代码 xff0c 在编译源代码的过程中遇到该问题 xff0c 编译结果中显示长篇的 CMakeFiles dense mapping dir dense m
  • [STM32F103C8T6] 串口

    1 非中断串口发送数据 串口发送 接收函数 xff1a HAL UART Transmit 串口发送数据 xff0c 使用超时管理机制 HAL UART Receive 串口接收数据 xff0c 使用超时管理机制 HAL UART Tran
  • 【C语言】strcat函数_字符串追加/连接

    前言 xff1a 在C C 43 43 的学习过程当中一定一定要多刷题 xff0c 牛客网作为国内内容超级丰富的IT题库 xff0c 尤其是它的C C 43 43 xff0c 有从入门到大厂真题 xff0c 而且大部分的考试题目也是从中抽取
  • SWUST OJ448: 字符串查找

    题目描述 在一段句子中找出给定字符串出现在句子中第一个字母出现的位置 句子中字符个数小于4500 字符串字符个数小于120 输入 两行 第一行是给定字符串 第二行是句子 输出 整数 xff0c 字符串出现的位置 样例输入 abcde thi
  • C语言十进制转十六进制

    输入 xff1a 123 输出 xff1a 7B include lt stdio h gt int main int n scanf 34 d 34 amp n int a 100 int count int i 61 0 while 1
  • CentOS软件那么老为什么大家还要用它?

    作为一个专业的服务器系统 xff0c RHEL 系统理论上每一个软件包都有 RedHat 内部的人员负责维护 xff0c 这个维护包括长期 xff08 和系统生命周期一样长 xff09 的开发 更新 测试 运维等 也就是说你能从 RHEL
  • vscode配置C/C++调试环境

    转自作者知乎的原创文章 vscode配置C 43 43 调试环境 在环境变量path中添加mingw中bin后 在vscode界面侧边栏点击调试界面 xff0c 创建launch json文件 添加配置后保存就行 下为我的添加配置后自动生成
  • ROS通信机制~话题通信(Publisher&Subscriber)·笔记2

    系列文章目录 xff1a ROS开发 xff08 ubuntu xff09 笔记 1 嘻 嘻的博客 CSDN博客 ROS通信机制 服务通信 server amp client 笔记3 嘻 嘻的博客 CSDN博客 话题通信 理论模型 xff1
  • postman Windows的详细安装过程

    1 首先去postman官网下载postman 官网地址 xff1a Download Postman Get Started for Free https www postman com downloads 2 根据你浏览器下载的所在位置
  • 数据结构链表的结构体定义的理解(C语言)

    此理解有参考数据结构的教材和一些博主的文章 xff1b 1 先补充一下typedef在此处的基本用法 xff1a typedef可用来建立已经定义好的数据类型的别名 形式为 xff1a typedef 已有变量名 别名 通俗的来说就是给已有
  • ROS安装与Rviz的摄像头视频采集与标定

    文章目录 一 ROS的安装与配置1 添加 ROS 软件源 xff0c 将下列命令输入到 Ubuntu 的终端执行2 添加密钥 xff0c 将下列命令输入到 Ubuntu 的终端执行3 安装desktop full4 初始化rostep5 设
  • HTTP协议的基本格式

    目录 一 HTTP请求 1 1 首行 1 1 1 URL 1 1 2 方法 1 2 请求报头 xff08 header xff09 1 2 1 host 编辑 1 2 2 Content Length和Content Type 1 2 3
  • 思岚雷达win与ubuntu18.04连接并测试详细过程

    雷达简介 包含套件 雷达模组 xff08 内置pwm电机驱动 xff09 usb适配器 Micro USB线缆 电源线 接线方式 ps 雷达不需额外的电源供电 xff0c 直接使用电脑USB接口 xff0c 5V供电 驱动安装 USB 适配
  • c/c++常见字符串函数(strlen,strcmp,strcat,strcpy,strstr,strncpy,strncat,strncmp)的详解和自己编辑实现

    下面介绍c语言中指针与数组的面试题 再看下列题之前首先要知识储备 下面用c语言介绍常用字符串函数和进行编译 一 介绍strlen函数 unsigned int strlen char s 或size t strlen const char
  • 【C语言】学数据结构前必学的结构体struct详细

    佛祖说 xff0c 他可以满足程序猿一个愿望 程序猿许愿有生之年写出一个没有bug的程序 xff0c 然后他得到了永生 目录 1 结构体的声明与定义 1 1结构体是什么 xff1f 1 2为什么要有结构 xff1f 1 3结构体的声明 1
  • 数据结构哈希查找的C语言实现

    大家好 xff0c 我是练习编程时长两年半的昆工第一ikun xff0c 今天我们来分享查找算法中的一个 哈希查找 xff0c 哈希查找适用于有庞大的数据量时的查找 xff0c 是一种很好用的查找算法 xff0c 话不多说 xff0c 开团
  • 为什么很多程序员喜欢linux系统?

    a gt Linux哪些行业在运用 xff1f Linux系统运用极其广泛 xff0c 不少用户只知道windows xff0c 是因为 xff0c Linux的运用主要是在企业端 现在科技极其发达 xff0c 我们手机在手 xff0c 就
  • Linux Ubuntu下的标准IO相关库函数的介绍与使用

    大家好 xff0c 我是练习编程时长两年半的个人练习生昆工第一ikun xff0c 今天我们来分享一下标准IO相关函数库的介绍与使用 xff0c 话不多话 xff0c 开团 xff01 xff01 xff01 xff01 xff01 目录
  • Linux Ubuntu下的文件IO介绍及实例应用(C语言)

    大家好 xff0c 我是练习编程时长两年半的个人练习生昆工第一ikun xff0c 昨天咋们说了标准IO xff0c 今天咋们来分享文件IO xff0c 以及一个很有趣的实例 xff0c 给图片加密 xff0c 使其无法打开 话不多说 xf