文章目录
标准输入、输出和标准错误
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp = fopen("myfile", "w");
if(!fp){
printf("fopen error!\n");
}
const char *msg = "hello bit!\n";
int count = 5;
while(count--){
fwrite(msg, strlen(msg), 1, fp);
}
fclose(fp);
return 0;
}
回顾这个代码以及输出结果:
上图中fwrite(msg, strlen(msg), 1, fp)
,其输出流选择的是文件指针指向的文件myfile
,所以myfile
的内容被写入进去了。
思考:
为什么使用printf和scanf能够分别打印内容以及接受内容?
其实C进程执行的时候会默认打开三个流,即标准输入(stdin)
,标准输出(stdout)
和标准错误(stderr)
如果我们将文件指针fp改成stdout,那么程序执行后,内容将被写道标准输出上,即屏幕。
stdin,stdout和stderr也是文件,因为形参的位置就是一个文件指针
- 一个命令或程序,按下回车键后,要么会显示程序运行的结果,要么会显示状态和错误信息。
- 以ls为例,当按下ls命令后,它会把其运行结果发送到一个称为标准输出(stdout) 的特殊文件中。
- 状态信息则会发送到一个称为 标准错误(stderr) 的文件中。
- 命令是通过键盘输入给电脑的,这个键盘叫做的标准输入(stdin)
- I/O重定向功能可以改变输出内容的发送目的(也就是不让你发送到屏幕上),也可以改变输入内容的来源地(也就是说甚至可以来自于文件)
系统调用接口(write、read)
- write:写入数据
- read:读取数据
- open:打开文件
- close:关闭文件
以上都是针对于系统层面而非用户层面。
库函数和系统调用接口的关系
C语言中的例如fwrite,fread等相关函数可能都比较熟悉,而再系统层面的write、read可能用的较为少。但其实他们之间的关系就是系统调用接口与用户操作接口之间的关系。
从开发角度上看,操作系统会对外表现为一个整体,但是会暴露自己的部分接口,以供上层开发者使用——系统调用。但是这样也带来了一个麻烦,因为系统层面的知识多而繁杂导致使用成本过高。所以一些开发者其实会将部分系统进行适度开发、封装来提供给用户使用,这也是库函数由来的原因
说的简单点,就是fwrite函数是建立在系统函数write之上,系统函数write只有一个,而相关的库函数可能有很多都是建立再write等函数而二次开发的。
open函数
函数原型以及头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>