目录
前言
在初学C语言之处,在学习一些函数的时候常常会出现 stream , stdin , stdout 等字眼。
如 getc , putchar等函数。先看下面两个函数的使用。
---(从流(stream)中读取一个字符,或者从标准输入(stdin)中获取一个字符)
--- 将字符写入流(stream)或标准输出(stdout)。
还有很多的函数出现了很多的关于流,标准输入输出的概念,虽然不太懂但是不影响我们使用这些库函数。那么到底什么是流呢?
什么是流,流的一些概念
在写一个C语言程序的时候,未来可能要将写好的数据输出到各种外部设备上(如屏幕,文件, 网络,硬盘,软盘,打印机...)。但是把这些数据输出到不同的设备上,需要的方法,协议可能都不相同。
所以,在写一个C语言程序的时候,为了方便编程人员,所以抽象出了一个流(stream)的概念。我们写的程序只要输入到流里就可以了,就不用再关心如何输出到外部设备。流如何输出数据到外部设备会由C语言所设计好,我们就不需要在关心了。
流 由 FILE* 指针来管理,是 FILE 的结构,前言中也可知 int getc(FILE* stream);
C语言默认会打开的流
任何一个C语言程序运行的时候,会默认打开3个流,其类型都是 FILE*
stdin ------- 标准输入 对应的其实就是 键盘
stdout ------- 标准输出 对应的其实就是 屏幕
stderr ------- 标准错误 对应的也是 屏幕
平时我们在使用 scanf, printf 的时候,都有用到流。
如 scanf Read formatted data from the standard input stream. 从标准输入流中读取数据
如 printf Print formatted output to the standard output stream. 打印数据到标准输出流中
C语言运行的时候,这三个标准输入输出流都是会默认打开的,所以我们可以直接使用 scanf 等函数。
文件操作的输入输出流
C语言运行起来会默认打开三个标准流,但是如果想要操作文件,就必须需要文件的流。C 语言程序运行起来不会随便打开某一个文件。 所以在操作文件的时候,首先要打开文件,拥有了这个文件的流,才能对流所对应的文件,进行数据的写或者读操作。
如下代码就是用 fopen 函数打开了当前文件夹下 test.txt(相对路径,也可以写成绝对路径(D:\test\test.txt)) 文件。
FILE* pf = fopen("test.txt", "w");
这样就获得了 pf 这个流,就可以对这个文件进行进行文件操作了。
可以这样理解。 pf 与 stdin 是一样的,都是 FILE* 类型的指针,只不过
pf 维护 test.txt 文件(一个指定的文件)
stdin 维护 键盘输入流
下面是文件函数以及其适用的输出或者输入流:
功能
|
函数名
|
适用于
|
字符输入函数
|
fgetc
|
所有输入流
|
字符输出函数
|
fputc
|
所有输出流
|
文本行输入函数
|
fgets
|
所有输入流
|
文本行输出函数
|
fputs
|
所有输出流
|
格式化输入函数
|
fscanf
|
所有输入流
|
格式化输出函数
|
fprintf
|
所有输出流
|
二进制输入
|
fread
|
文件
|
二进制输出
|
fwrite
|
文件
|
适用于所有输入流/输出流 的函数可以适用于标准输入输出流(stdin/stdout/stderr),也能适用于文件流。也就是说适用于所有输入/输出流的文件可以从文件中读,也可以从键盘上读取数据;可以输出到文件,也可以输出到屏幕。
//适用于标准输入输出流 从键盘读取,屏幕输出
int main()
{
int ch = fgetc(stdin); //fgetc 从 stdin 流中读取一个字符
fputc(ch, stdout); //fputc 将一个字符输出到 stdout 流中
return 0;
}
//适用于文件流 从文件中读取,打印到文件中
int main()
{
FILE* pf = fopen("test.txt", "r+"); //读写模式 文件中已经有数据
//读文件
int ch = fgetc(pf); // fgetc 从 pf 流中读取一个字符
printf("%c\n", ch);
//写文件
fputc('a', pf); //fputc 将字符a写到 pf 流中
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
而二进制输入输出函数只能适用于文件流,只能针对文件。