【Linux】基础IO
一、C语言中文件IO操作
1.C语言中的开关读写文件
在学习Linux中的IO操作之前,我们先来简单的回顾一下,C语言中我们常用的一些IO操作的接口。
1.1.fopen()
FILE* fopen(const char* path, const char* mode);
- 函数参数
path
:要打开的文件mode
:打开文件的方式r
:可读方式r+
:可读可写方式w
:可写方式,如果文件不存在,就创建一个文件。如果文件已经存在,就截断一个文件(清空文件内容)w+
:可读可写方式,如果文件不存在,就创建一个文件。如果文件已经存在,就截断一个文件(清空文件内容)a
:追加写,但是不可以读取内容。如果文件不存在,就创建一个文件。如果文件已经存在,就在文件的末尾开始追加写a+
:追加写,可以读取内容。如果文件不存在,就创建一个文件。如果文件已经存在,就在文件的末尾开始追加写
- 函数返回值
- 成功:返回一个文件流指针
FILE
- 失败:返回
NULL
- 成功:返回一个文件流指针
作用:以某种方式打开一个文件,并返回一个指向该文件的文件流指针。
1.2.fclose()
int fclose(FILE* fp);
作用:关闭传入的文件流指针指向的文件。
1.3.fwrite()
size_t fwrite(void* ptr, size_t size, size_t nmemb, FILE* stream);
- 函数参数
ptr
:写入文件的内容size
:往文件中写入的块的大小,单位为字节nmemb
:预期写入的块数stream
:预期写入文件的文件指针
- 函数返回值
- 成功:写入文件中的块数
- 常见用法
- 定义块的大小为1个字节,
nmemb
为向写入的字节数量,返回值为成功写入的字节数
- 定义块的大小为1个字节,
#include <cstdio>
#include <cstring>
#include <cstdlib>
int main()
{
FILE* fp = fopen("myfile.txt", "w");
if (!fp) {
perror("fopen");
exit(-1);
}
const char* msg = "hello Linux file\n";
fwrite(msg, sizeof(char), strlen(msg), fp);
fclose(fp);
return 0;
}
运行结果:
注意:fopen()
中的path
不是执行程序的所处的路径,而是进程运行时做出的路径。
举例:
1.4.fread()
size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream);
- 函数参数
ptr
:将从文件读取的内容保存在ptr
所指向的空间中size
:定义读文件时块的大小,单位为字节nmemb
:期望从文件中读的块数stream
:预期读取文件的文件指针
- 函数返回值
- 成功从文件中读取的块的个数
- 常见用法
- 定义块的大小为1个字节,
nmemb
为向写入的字节数量,返回值为成功读取的字节数
- 定义块的大小为1个字节,
#include <cstdio>
#include <cstring>
#include <cstdlib>
int main()
{
FILE* fp = fopen("myfile.txt", "r");
if (!fp) {
perror("fopen");
exit(-1);
}
char buff[64];
fread(buff, sizeof(char), sizeof(buff) / sizeof(char), fp);
printf("%s", buff);
fclose(fp);
return 0;
}
运行结果:
2.stdin&&stdout&&stderr
默认情况下,C语言会自动打开两个输入输出流,分别是stdin
,stdout
,stderr
。
这三个流的类型都是FILE
,也就是文件指针类型。
既然是文件指针,所以这三个指针分别指向键盘,显示器,显示器。后面的系统IO会再详细的讲解这三个输入输出流。
3.三个标准流和IO接口
可以利用上面这三个标准流和C语言的IO接口,将字符串直接打印到显示器上。
#include <cstdio>
#include <cstring>
#include <cstdlib>
int main()
{
FILE* fp = fopen("myfile.txt", "w+");
if (!fp) {
perror("fopen");
exit(-1);
}
char buff[64];
fread(buff, sizeof(char), 12, stdin);// 从键盘中输入到buff中
fwrite(buff, sizeof(char), strlen(buff), stdout); // 从buff中写入到显示器上
fclose(fp);
return 0;
}
运行结果:
二、系统文件IO
其实除了C语言之外,很多语言都是自己的IO接口函数,但是下面我们要谈论的就是系统给我们提供的IO接口,也就是系统级别的IO接口。
1.系统级别的开关读写文件
1.1.open()
// 在打开的文件已经存在的时候
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_TRUNC
:截断文件(清空文件内容)O_CREAT
:文件不存在则创建文件O_APPEND
:追加方式O_EXXL | O_CREAT
:如果文件存在,则打开文件失败
- 原理
- 可以使用按位或的方式进行组合:如打开并创建只写文件
O_WRONLY | O_CREAT
- 本质是利用了位图的方式来表示每一种的方式
- 可以使用按位或的方式进行组合:如打开并创建只写文件
- 必选项
mode
:当打开一个新开的文件的时候,需要给一个文件设置权限,需要设置一个8进制的数字。这个和umask
也会有关系
- 函数返回值
- 成功:返回一个文件描述符(后面介绍)
- 失败:返回-1
作用:打开一个文件
1.2.close()
int close(int fd);
- 函数参数
fd
:文件描述符
作用:关闭一个文件
1.3.write()
ssize_t write(int fd, const void* buf, size_t count);
- 函数参数
fd
:文件描述符buf
:将buf中的内容写到文件中count
&