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
  #include
  #include

  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 
​
   int close(int fd);
   参数:
    fd:要关闭文件的文件描述符
   返回值:
    成功返回0,失败返回-1

  (3)读写文件

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

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

(4)文件定位 -- lseek

   #include 
   #include 
​
   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 
#include 
#include 
#include 
#include 
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;
} 

运行程序,如下图:

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

Linux Ubuntu下的文件IO介绍及实例应用(C语言)_第1张图片

 

Linux Ubuntu下的文件IO介绍及实例应用(C语言)_第2张图片

 


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

你可能感兴趣的:(linux,ubuntu,c语言)