Linux Ubuntu下的文件IO介绍及实例应用(C语言)
大家好,我是练习编程时长两年半的个人练习生昆工第一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语言)相关推荐
- [Linux] Ubuntu下的文件比较工具--meld
在ubuntu中需要比较文件的差异,于是安装meld apt-get install meld 安装完后,在/usr/bin/下找到meld,然后发送到桌面上, 或者在命令行执行meld命令 打开后选 ...
- 安卓linux交叉编译,Linux Ubuntu下用Android NDK 生成独立交叉编译链
本文主要介绍使用Android NDK生成独立交叉编译链,然后使用独立交叉编译链编译Android程序 下载NDK 下载与自己操作系统相吻合的版本 下载地址 解压到安装目录(如~/myndk): ta ...
- 解决Linux ubuntu下SSH无法连接的问题
转自:解决Linux ubuntu下SSH无法连接的问题,更优阅读体验:http://www.kongzid.com/ 目录 1.检查是否开启SSH服务 2.安装SSH服务 3.启动SSH服务 4.修 ...
- linux打开文件exe,Linux Ubuntu 打开.exe文件
这两天在编译Android源码,进行到要在Linux里安装烧录软件那一步,要先装驱动,故了解了如何在linux下打开.exe文件. .exe 文件在linux下不能直接打开,可有两种方式打开:. 1. ...
- Linux操作系统下DHCP服务器配置方法介绍
Linux操作系统下DHCP服务器配置方法介绍 1.安装dhcp软件包 #rpm –ivh dhcp-3.0.1-12_EL.i386.rpm 2.配置文件dhcpd.conf 由于dhcpd.con ...
- qt程序在Linux下字体乱了,解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!...
本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开W ...
- ubuntu下rar文件解压后文件名乱码的解决方案
在linux解压rar文件,通常使用的命令是 rar e a.rar 但是由于编码的缘故,在windows下打包的的中文文件,解压后时候乱码,提示为无效的编码格式,由于windows是gbk的编码格式 ...
- Ubuntu下 .Desktop文件设置
Ubuntu下 .Desktop文件设置 可参考: 创建并使用Linux 桌面启动器(.Desktop文件) PS:文件中一定不能有多余空格,否则无法启动!!!
- Ubuntu下打开文件乱码及编码转换
txt文件在Windows下可以正常显示,Ubuntu下打开文件乱码.这是中文编码问题,Windows下用的是gb2312,而linux下用的是utf8.在此提供5种解决方案: 1. 在文档所在目录运 ...
最新文章
- int/double/string使用
- linux下安装QQ
- 《模式识别与机器学习》学习笔记:2.2 多项变量
- Linux命令(1)—— ls、pwd、tree、clear、文件相关操作
- 项目搭建Nacos及遇到问题解决
- MFC 常见窗口操作
- 在win10在使用cmder代替Linux是怎样的体验
- 代码管理仓库项目任务计划
- Rational Rose打开mdl文件显示“there are warning,see the log for details”问题解决方法
- js获取当前屏幕宽度方法
- Aho-Corasic多模匹配算法的学习、理解和应用(Python环境下)
- 【废了-准备删除01】渗透测试靶机搭建——基于WAMP的drupal7.x管理系统
- Python每日一记196pandas.core.indexing.IndexingError: Too many indexers
- php技术创新:利用动态404页面实现全站自动静态化
- ResNet的改进系列:ResNext和Res2Net
- python集合和列表、安从小到大的顺序组合成一个字典_第3章 Python容器:列表、元组、字典与集合...
- 自己搭深度学习环境踩坑血泪史
- IP媒体服务器:3G视频业务的基石
- iBase4J是Java的分布式系统架构 使用Springboot整合开源框架
- Ubuntu 18.04 ———(Intel RealSense D435i)安装相机的驱动librealsense + realsense-ros