01文件IO

发布于:2025-03-01 ⋅ 阅读:(123) ⋅ 点赞:(0)

一、linux_C函数接口手册

在线手册

Linux 常用C函数(中文版)

linux一切皆文件

在linux系统下一切都是以文件的形式存储在系统中的,通过linux系统提供的IO(input/output)接口开发板就可以往linux系统中

输入一些信息和获取一些信息。

linux系统的文件分类:

-  普通文件:存在于外部存储器中,用于存储普通数据。
d  目录文件:用于存放目录项,是文件系统管理的重要文件类型。
p  管道文件:一种用于进程间通信的特殊文件,也称为命名管道FIFO。
s  套接字文件:一种用于网络间通信的特殊文件。
l  链接文件:用于间接访问另外一个目标文件,相当于Windows快捷方式。
c  字符设备文件:字符设备在应用层的访问接口。
b  块设备文件:块设备在应用层的访问接口。

基于linux操作系统的开发框架

二、linux系统IO接口使用

man 2 open 查看open函数接口

1、open 打开文件

NAME
       open, openat, creat - open and possibly create a   file
                     功能:   打开  和  或许     创建  一个 文件
SYNOPSIS
       #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     读写
       返回值: 成功  新的文件描述符   
               失败  -1 
               
例子:打开一个普通文本文件  
int fd = open("./my.txt",O_RDWR);           
if(fd < 0)
{
    printf("打开文件失败\n");
}else 
{
      printf("打开文件成功\n");
}

open 附加参数

//以创建的方式打开文件
 int open(const char *pathname, int flags, mode_t mode);
 pathname:文件路径名  
 mode : 设置创建文件的权限  
 flags: 权限参数三选一
        O_RDONLY   只读
        O_WRONLY   只写
        O_RDWR     读写
        附加参数
        O_APPEND  追加模式    👉 int  fd = open("my.txt",O_RDWR|O_APPEND); 追加模式每次打开文件光标在末尾
        O_TRUNC   清空模式    👉 int  fd = open("my.txt",O_RDWR|O_TRUNC);  清空模式每次打开文件都清空所有内容
        O_CREAT   创建模式    👉 int  fd = open("my.txt",O_RDWR|O_CREAT,0777);  创建模式文件不存在则会创建文件,并设置rwxrwxrwx权限
 O_EXCL|O_CREAT   检查模式    👉 int  fd = open("my.txt",O_RDWR|O_EXCL|O_CREAT,0777); 检查模式,文件不存在则创建,文件存在则打开失败。

文件描述符队列

linux系统中用户每次打开一个文件,操作系统就会生成一个对应的描述符,后续用户想要操作该文件时,只需要操作这个描述符即可!

2、write 写入文件

man 2 write 查看写入接口

NAME
       write - write to a file descriptor
       功能:    写入  一个 文件 描述符                   
SYNOPSIS
       #include <unistd.h>

       ssize_t write(int fd, const void *buf, size_t count);
          fd:需要写入的文件描述符 
          buf:数据的缓存地址 
        count:数据的大小   
        返回值:成功  返回写入的字节数 
              失败   -1
              
例子:写入数据到文件中 
write(fd,"hello",5);              

char buf[1024] = {"hello"}; // 只赋值前面5个字符,后面都是 0
int size = write(fd, buf, sizeof(buf)); //sizeof(buf) 把hello 后面的0也写入文件中了 ❌
int size = write(fd, buf, strlen(buf)); // strlen(buf) 字符串有效长度 5      ✔️   

注意:写入数据到文件中时,必须写入数据的真实大小。否则会写入乱码!     

3、read 读取文件

man 2 read 查看读取接口

NAME
       read - read from a file descriptor
        功能   读取 从   一个 文件 描述符
SYNOPSIS
       #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t count);
           fd:需要读取的文件描述符  
           buf:读取后数据的存储地址 
          count:需要读取的数据大小 
          返回值:  大于 0  成功读取到的字节数 
                  等于 0   文件读取完毕  ✔️一直读取一个文件,直到为0,则文件读取完毕! 
                  小于 0   文件读取错误  
                  
例子:读取一个文件的内容到缓存中 
char  buf[1024]={0}; 
read(fd,buf,1024);    
                
                            
例子:读取一个文件的中的所有内容 
while(1)
{
 char  buf[1024]={0}; 
 if(read(fd,buf,1024) == 0)
 {
     break; 
 }       
}                                  
                                                                                                                                
注意:在读取一个文件时,用户定义的缓存为多大,则读取多大。       
     1.如果文件的数据比缓存小,则会全部数据读取出来。 
     2.如果文件的数据比缓存大,则需要多次读取直到返回0             

4、lseek 文件光标

当用户操作一个文件描述符时,每次读写文件光标的位置都会发生偏移 ,用户可以使用lseek 修改文件光标的当前位置!

NAME
       lseek - reposition read/write file offset
                修改       读/写     文件   位置                 
SYNOPSIS
       #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 文件末尾 
        
例子:把光标移动到文件头 
lseek(int fd,0,SEEK_SET); //从文件SEEK_SET(头)开始偏移0个位置。 
lseek(int fd,0,SEEK_END); //从文件SEEK_END(末尾)开始偏移0个位置。    
        

5、close 关闭文件描述符

NAME
       close - close a file descriptor

SYNOPSIS
       #include <unistd.h>

       int close(int fd);
       fd:需要关闭的文件描述符 

 

系统IO访问设备文件

linux系统的设备文件与普通文件是一样的,都是以文件的形式存储到系统的磁盘中。所以用户只需要1.打开设备文件

2.写入或者读取设备文件 3.关闭设备文件即可访问设备文件。

访问LCD设备流程

1.打开LCD设备文件

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

int main()
{
    // 1.打开LCD设备文件
    int lcd_fd = open("/dev/fb0", O_RDWR);
    if (lcd_fd < 0)
    {
        printf("打开LCD设备失败\n");
        return -1;
    }
    else
    {
        printf("打开LCD设备成功\n");
    }
}

2.往设备文件写入内容

注意:1.如果文件类型是普通ASCII文件,就可以写入字符串!

2.如果文件类型是设备文件,就要写入设备需要数据!

当前操作的是LCD设备,LCD设备的作用是显示图像的,所以就应该往屏幕中写入一些图像数据!

// 0xFFFF00 黄色  -> int
    int color[800 * 480] = {0};
    for (int i = 0; i < 800 * 480; i++)
    {
        color[i] = 0xFFFF00; // 把所有颜色点赋值为黄色
    }

    // 2.写入数据到LCD设备文件中
    write(lcd_fd, color, 800 * 480 * 4);

3、计算机表达图像的方式

图像组成的基本单位像素点

4、像素点的组成

所以想要LCD屏幕显示对应的图像,只有把对应图像的像素点,写入屏幕设备即可!

RGB颜色查询对照表|RGB颜色|三原色配色表

一个像素点由 R,G,B 组成,每个RGB的取值范围是
R:0 -> 255 , 一个字节  
G:0 -> 255 , 一个字节 
B:0 -> 255 , 一个字节   

红色:0xFF0000
绿色:0x00FF00
蓝色:0x0000FF
天蓝:0x00FFFF
黄色:0xFFFF00

屏幕像素点与缓存的关系

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

int main()
{
    // 1.打开LCD设备文件
    int lcd_fd = open("/dev/fb0", O_RDWR);
    if (lcd_fd < 0)
    {
        printf("打开LCD设备失败\n");
        return -1;
    }
    else
    {
        printf("打开LCD设备成功\n");
    }

    // 2.定义一个二维数组
    int color[480][800] = {0};

    // 分区域赋值
    for (int y = 0; y < 240; y++)
    {
        for (int x = 0; x < 400; x++)
        {
            color[y][x] = 0xff0000;
        }
    }

    for (int y = 0; y < 240; y++)
    {
        for (int x = 400; x < 800; x++)
        {
            color[y][x] = 0x00ff00;
        }
    }

    for (int y = 240; y < 480; y++)
    {
        for (int x = 0; x < 400; x++)
        {
            color[y][x] = 0x0000ff;
        }
    }

    for (int y = 240; y < 480; y++)
    {
        for (int x = 400; x < 800; x++)
        {
            color[y][x] = 0xff00ff;
        }
    }

    // 把缓存区写入到LCD屏幕中
    write(lcd_fd, color, sizeof(color));
}

至此,希望看完这篇文章的你有所收获,我是Bardb,译音八分贝,道友,下期见!