大家好,我是练习编程时长两年半的个人练习生昆工第一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,咋们明天见。

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

  1. [Linux] Ubuntu下的文件比较工具--meld

    在ubuntu中需要比较文件的差异,于是安装meld apt-get install meld 安装完后,在/usr/bin/下找到meld,然后发送到桌面上, 或者在命令行执行meld命令 打开后选 ...

  2. 安卓linux交叉编译,Linux Ubuntu下用Android NDK 生成独立交叉编译链

    本文主要介绍使用Android NDK生成独立交叉编译链,然后使用独立交叉编译链编译Android程序 下载NDK 下载与自己操作系统相吻合的版本 下载地址 解压到安装目录(如~/myndk): ta ...

  3. 解决Linux ubuntu下SSH无法连接的问题

    转自:解决Linux ubuntu下SSH无法连接的问题,更优阅读体验:http://www.kongzid.com/ 目录 1.检查是否开启SSH服务 2.安装SSH服务 3.启动SSH服务 4.修 ...

  4. linux打开文件exe,Linux Ubuntu 打开.exe文件

    这两天在编译Android源码,进行到要在Linux里安装烧录软件那一步,要先装驱动,故了解了如何在linux下打开.exe文件. .exe 文件在linux下不能直接打开,可有两种方式打开:. 1. ...

  5. Linux操作系统下DHCP服务器配置方法介绍

    Linux操作系统下DHCP服务器配置方法介绍 1.安装dhcp软件包 #rpm –ivh dhcp-3.0.1-12_EL.i386.rpm 2.配置文件dhcpd.conf 由于dhcpd.con ...

  6. qt程序在Linux下字体乱了,解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!...

    本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开W ...

  7. ubuntu下rar文件解压后文件名乱码的解决方案

    在linux解压rar文件,通常使用的命令是 rar e a.rar 但是由于编码的缘故,在windows下打包的的中文文件,解压后时候乱码,提示为无效的编码格式,由于windows是gbk的编码格式 ...

  8. Ubuntu下 .Desktop文件设置

    Ubuntu下 .Desktop文件设置 可参考: 创建并使用Linux 桌面启动器(.Desktop文件) PS:文件中一定不能有多余空格,否则无法启动!!!

  9. Ubuntu下打开文件乱码及编码转换

    txt文件在Windows下可以正常显示,Ubuntu下打开文件乱码.这是中文编码问题,Windows下用的是gb2312,而linux下用的是utf8.在此提供5种解决方案: 1. 在文档所在目录运 ...

最新文章

  1. int/double/string使用
  2. linux下安装QQ
  3. 《模式识别与机器学习》学习笔记:2.2 多项变量
  4. Linux命令(1)—— ls、pwd、tree、clear、文件相关操作
  5. 项目搭建Nacos及遇到问题解决
  6. MFC 常见窗口操作
  7. 在win10在使用cmder代替Linux是怎样的体验
  8. 代码管理仓库项目任务计划
  9. Rational Rose打开mdl文件显示“there are warning,see the log for details”问题解决方法
  10. js获取当前屏幕宽度方法
  11. Aho-Corasic多模匹配算法的学习、理解和应用(Python环境下)
  12. 【废了-准备删除01】渗透测试靶机搭建——基于WAMP的drupal7.x管理系统
  13. Python每日一记196pandas.core.indexing.IndexingError: Too many indexers
  14. php技术创新:利用动态404页面实现全站自动静态化
  15. ResNet的改进系列:ResNext和Res2Net
  16. python集合和列表、安从小到大的顺序组合成一个字典_第3章 Python容器:列表、元组、字典与集合...
  17. 自己搭深度学习环境踩坑血泪史
  18. IP媒体服务器:3G视频业务的基石
  19. iBase4J是Java的分布式系统架构 使用Springboot整合开源框架
  20. Ubuntu 18.04 ———(Intel RealSense D435i)安装相机的驱动librealsense + realsense-ros

热门文章

  1. STM32F103标准库开发---SPI实验---W25Qxx系列外部Flash芯片
  2. Struts2框架搭建
  3. 使用fabric.js简简单单实现一个画板
  4. Thread.yield()详解
  5. 深圳流水线工厂,我差点和主管打了起来 | 十年系列
  6. JS中会改变原数组和原字符串的API方法总结
  7. Java项目:基于JSP的养老院管理系统
  8. Spring版本及常用商业软件版本说明
  9. Windows XP 的最高版本 .net framework 安装
  10. 工业大数据在铅粉机的应用(一)