欢迎来到Cefler的博客
博客主页:那个传说中的man的主页
个人专栏:题目解析
推荐文章:题目大解析(3)
文件 = 内容+属性
所有对文件的操作:a.对内容操作 b.对属性操作。
内容是数据,属性其实也是数据。我们访问一个文件(我们是一个进程!),一个文件打开前是:普通的磁盘文件,打开后:将文件加载到内存
一个进程可以打开多个文件
我们研究文件操作的本质:就是进程和被打开文件的关系
进程通过操作系统打开文件,而操作系统提供接口(如fopen)给进程打开磁盘中的文件。
操作系统访问硬件磁盘中的文件,要加载到内存中,而操作系统要管理文件,必须先描述,再组织,所以一个文件的要被打开,一定先在内核中形成被打开的文件对象,即描述PCB。
1.fopen以写的形式打开,源文件内容会被清空
2.向文件写入字符串,strlen(str),不需要加+1,即不用写入\0
C语言中的open()
函数是打开文件的函数,它可以用于创建或打开文件,并返回一个文件描述符(file descriptor)。
open()
函数的声明如下:
#include
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
其中,第一个参数pathname
是指要打开(或创建)的文件的路径名,这个参数是必须的。第二个参数flags
是一个控制文件打开方式的标志,这个参数也是必须的。第三个参数mode
表示新建文件时的权限,只有在创建新文件时才需要传入。
flags
参数常用的取值如下:
O_RDONLY
:只读模式打开文件O_WRONLY
:只写模式打开文件O_RDWR
:读写模式打开文件O_CREAT
:如果文件不存在则创建文件O_TRUNC
:如果文件已经存在,则把文件截断为0长度O_APPEND
:以追加模式打开文件mode
参数常用的取值如下:
S_IRUSR
:用户读权限S_IWUSR
:用户写权限S_IXUSR
:用户执行权限S_IRGRP
:组读权限S_IWGRP
:组写权限S_IXGRP
:组执行权限S_IROTH
:其他用户读权限S_IWOTH
:其他用户写权限S_IXOTH
:其他用户执行权限open()
函数返回一个文件描述符
,这个描述符是一个整数值,它是操作系统为了方便管理文件而提供的一种接口。在后续的文件读写等操作中,我们可以使用这个文件描述符来指代该文件。
如果open()
函数执行成功,则返回一个非负整数(文件描述符),否则返回-1。通常,当返回-1时,errno变量会被设置为下面的某个值来表示错误原因:
EACCES
:无法访问指定文件ENOENT
:指定文件不存在EEXIST
:文件已经存在,但打开标志中指定了O_CREAT
标志EINVAL
:打开标志无效例如,要以只读模式打开一个文件,可以这样调用open()
函数:
int fd;
fd = open("/path/to/file", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
exit(EXIT_FAILURE);
}
在使用完文件后,应该使用close()
函数关闭文件描述符:
int ret;
ret = close(fd);
if (ret == -1) {
perror("Error closing file");
exit(EXIT_FAILURE);
}
这是open()
函数的基本用法,还有一些高级用法,比如使用open()
函数打开套接字或管道等,不过这些用法超出了本回答的范围。
文件的返回值fd是一个连续的小整数,fd的本质就是进程文件描述符表数组的下标!
而OS会默认先打开三个标准文件,标准输入stdin,标准输出stdout,标准错误stderr,下标分别为0,1,2。OS默认打开这三个标准,就是为了让程序员默认进行输入输出代码编写。
stdin,stdout,stderr这些标准文件,都有来实现读写功能的函数,而文件PCB中存储着这些函数的函数指针。
write()
函数是C语言中用于向文件描述符(或者套接字)中写入数据的函数。
write()
函数的声明如下:
#include
ssize_t write(int fd, const void *buf, size_t count);
其中,fd
是要写入的文件描述符,buf
是指向要写入数据的缓冲区的指针,count
是要写入的字节数。
write()
函数的返回值是成功写入的字节数,如果出现错误,则返回-1,并设置全局变量errno以指示错误类型。
下面是一个简单的示例,演示如何使用write()
函数向文件中写入数据:
#include
#include
#include
#include
int main() {
int fd;
ssize_t bytes_written;
const char *str = "Hello, world!\n";
fd = open("output.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
bytes_written = write(fd, str, strlen(str));
if (bytes_written == -1) {
perror("write");
exit(EXIT_FAILURE);
}
close(fd);
return 0;
}
在这个示例中,首先使用open()
函数打开一个文件,然后使用write()
函数向这个文件中写入数据,最后使用close()
函数关闭文件描述符。
需要注意的是,write()
函数是以字节为单位进行写入的,如果要写入一个字符串,需要使用strlen()
函数来获取字符串的长度。此外,write()
函数并不会自动在字符串的末尾添加空字符(‘\0’),所以在写入字符串时需要确保字符串以null结尾,或者传入字符串长度时包含结尾的null字符。
如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注❤️ ,学海无涯苦作舟,愿与君一起共勉成长