【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;
}
运行结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-99d4hoFd-1635688996857)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634819512265.png)]](https://i-blog.csdnimg.cn/blog_migrate/4dde171f5f3f4847633bb4b087ee8c1c.png)
注意:fopen()中的path不是执行程序的所处的路径,而是进程运行时做出的路径。
举例:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q6E4HfTk-1635688996859)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634819722525.png)]](https://i-blog.csdnimg.cn/blog_migrate/a32d4ecd4720aa421fce91700d788713.png)
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;
}
运行结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-odv2rEx0-1635688996860)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634820342320.png)]](https://i-blog.csdnimg.cn/blog_migrate/85eb80e66966e5887493d6a08c8e1017.png)
2.stdin&&stdout&&stderr
默认情况下,C语言会自动打开两个输入输出流,分别是stdin,stdout,stderr。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vYs7a1Js-1635688996862)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634820757387.png)]](https://i-blog.csdnimg.cn/blog_migrate/9bb9daf4c17095233c4826301068ed0b.png)
这三个流的类型都是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;
}
运行结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6a9BnDnx-1635688996864)(D:\github\gitee\linux-study\【Linux】基础IO.assets\1634821318807.png)]](https://i-blog.csdnimg.cn/blog_migrate/fef5da4e68b3353b04b216d5f4c1a7d4.png)
二、系统文件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:将b

最低0.47元/天 解锁文章
2688

被折叠的 条评论
为什么被折叠?



