【从零开始的嵌入式生活】文件I/O 2——文件IO和库(1)

简介: 【从零开始的嵌入式生活】文件I/O 2——文件IO和库(1)

文章目录

文件IO——介绍

文件描述符

文件操作

open函数

close函数

read函数

write函数

lseek函数

目录操作

opendir函数

readdir函数

chmod/fchmod函数用来修改文件的访问权限:

stat/lstat/fstat函数用来获取文件属性:

通过系统提供的宏来判断文件类型:

通过系统提供的宏来获取文件访问权限:

程序库

库的基本概念

静态库特点

静态库创建

共享库

共享库创建

共享库使用

写在最后

文件IO——介绍

posix(可移植操作系统接口)定义的一组函数

不提供缓冲机制,每次读写操作都引起系统调用

核心概念是文件描述符

Linux下, 标准IO基于文件IO实现

6a93e255f05467b40f08f2f0f7f6829.png


文件描述符

每个打开的文件都对应一个文件描述符。

文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符。

文件描述符从0开始分配,依次递增。

文件IO操作通过文件描述符来完成。

上节课有说过三个默认的文件打开表象,分别就是012对应stdin stdout stderrr


文件操作

open函数

#include <fcntl.h>
int open(const char *path, int oflag, mode_t mode);


成功时返回文件描述符;出错时返回EOF

打开文件时使用两个参数

创建文件时第三个参数指定新文件的权限

只能打开设备文件


e68115841ff88f2e539c41ff2fd3446.png

close函数

#include  <unistd.h>
int  close(int fd);


成功时返回0;出错时返回EOF

程序结束时自动关闭所有打开的文件

文件关闭后,文件描述符不再代表文件

read函数

#include  <unistd.h>
ssize_t  read(int fd, void *buf, size_t count);


成功时返回实际读取的字节数;出错时返回EOF

读到文件末尾时返回0

buf是接收数据的缓冲区

count不应超过buf大小

综合应用代码


#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main(){
        int fd;
        int n = 0;
        char buf[2];
        fd = open("1.txt", O_RDONLY|O_EXCL, 0666);
        if(fd){
                while(read(fd, buf, 1) > 0){
                        n++;
                }
                printf("n=%d\n", n);
        }
        close(fd);
        return 0;
}


write函数

#include  <unistd.h>
ssize_t  write(int fd, void *buf, size_t count);


成功时返回实际写入的字节数;出错时返回EOF

buf是发送数据的缓冲区

count不应超过buf大小

示例代码


#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main(){
       int fd;
       int n = 0;
      char buf[11];
       fd = open("1.txt", O_RDWR|O_APPEND, 0666);
       if(fd){
               fgets(buf, 10, stdin);
               write(fd, buf, 10);
       }
       close(fd);
       return 0;
}

lseek函数

#include  <unistd.h>
off_t  lseek(int fd, off_t offset, intt whence);


成功时返回当前的文件读写位置;出错时返回EOF

参数offset和参数whence同fseek完全一样

目录操作

opendir函数

#include  <dirent.h>
DIR  *opendir(const char *name);


DIR是用来描述一个打开的目录文件的结构体类型

成功时返回目录流指针;出错时返回NULL

readdir函数

#include  <dirent.h>
struct  dirent *readdir(DIR *dirp);


struct dirent是用来描述目录流中一个目录项的结构体类型

包含成员char d_name[256] 参考帮助文档

成功时返回目录流dirp中下一个目录项;

出错或到末尾时时返回NULL

综合示例代码

#include <dirent.h>
#include <stdio.h>
int main(){
       DIR *dir;
       struct dirent *dent;
       dir = opendir(".");
       if(dir)
               while((dent = readdir(dir)) != NULL)
                       printf("%s\n", dent->d_name);
       return 0;
}


chmod/fchmod函数用来修改文件的访问权限:

#include  <sys/stat.h>
int  chmod(const char *path, mode_t mode);
int  fchmod(int fd, mode_t mode);


成功时返回0;出错时返回EOF

root和文件所有者能修改文件的访问权限

stat/lstat/fstat函数用来获取文件属性:

#include  <sys/stat.h>
int  stat(const char *path, struct stat *buf);
int  lstat(const char *path, struct stat *buf);
int  fstat(int fd, struct stat *buf);


成功时返回0;出错时返回EOF

如果path是符号链接stat获取的是目标文件的属性;而lstat获取的是链接文件的属性

struct stat是存放文件属性的结构体类型:


struct stat {
   dev_t         st_dev;       //文件的设备编号
   ino_t         st_ino;       //节点
   mode_t        st_mode;      //文件的类型和存取的权限
   nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
   uid_t         st_uid;       //用户ID
   gid_t         st_gid;       //组ID
   dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
   off_t         st_size;      //文件字节数(文件大小)
   unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
   unsigned long st_blocks;    //块数
   time_t        st_atime;     //最后一次访问时间
   time_t        st_mtime;     //最后一次修改时间
   time_t        st_ctime;     //最后一次改变时间(指属性)
};


相关文章
|
3天前
|
Java Unix Windows
|
3天前
|
存储 JSON 安全
Python中的文件操作与文件IO操作
【5月更文挑战第14天】在Python中,文件操作是常见任务,包括读取、写入和处理文件内容。`open()`函数是核心,接受文件路径和模式(如&#39;r&#39;、&#39;w&#39;、&#39;a&#39;、&#39;b&#39;和&#39;+&#39;)参数。本文详细讨论了文件操作基础,如读写模式,以及文件IO操作,如读取、写入和移动指针。异常处理是关键,使用`try-except`捕获`FileNotFoundError`和`PermissionError`等异常。进阶技巧涉及`with`语句、`readline()`、`os`和`shutil`模块。数据序列化与反序列化方面,介绍了
17 0
|
3天前
|
Java 开发者
Java一分钟之-Java IO流:文件读写基础
【5月更文挑战第10天】本文介绍了Java IO流在文件读写中的应用,包括`FileInputStream`和`FileOutputStream`用于字节流操作,`BufferedReader`和`PrintWriter`用于字符流。通过代码示例展示了如何读取和写入文件,强调了常见问题如未关闭流、文件路径、编码、权限和异常处理,并提供了追加写入与读取的示例。理解这些基础知识和注意事项能帮助开发者编写更可靠的程序。
17 0
|
3天前
|
C++ 数据格式
【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]
【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]
【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]
|
3天前
|
安全 Go
Golang深入浅出之-Go语言标准库中的文件读写:io/ioutil包
【4月更文挑战第27天】Go语言的`io/ioutil`包提供简单文件读写,适合小文件操作。本文聚焦`ReadFile`和`WriteFile`函数,讨论错误处理、文件权限、大文件处理和编码问题。避免错误的关键在于检查错误、设置合适权限、采用流式读写及处理编码。遵循这些最佳实践能提升代码稳定性。
24 0
|
3天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
3天前
|
人工智能 算法 调度
uvloop,一个强大的 Python 异步IO编程库!
uvloop,一个强大的 Python 异步IO编程库!
37 2
|
3天前
|
存储 缓存 安全
Java 中 IO 流、File文件
Java 中 IO 流、File文件
|
3天前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
8 2
|
3天前
|
存储 缓存 Java
Java IO 流详解
Java IO 流详解
18 1

热门文章

最新文章

相关课程

更多