标准文件(万物皆文件)
Created|Updated|programming languages
|Post Views:
说明
stdio.h头文件把3个文件指针(stdin,stdout,stderr),与3个标准文件相关联。C程序会自动打开这3个标准文件
Q&A
Q
唉?为什么跟我们平时所看到的文件(word文档,txt文件。。。)不一样?那么这些文件又是放在哪里,是在磁盘吗?
A
操作系统为了对各种硬件进行操作,简化接口。所以,把电脑的硬件设备也看成了文件。
如:scanf()函数的作用,就是从stdin(键盘)上面获取信息。
printf()函数的作用,就是从stdout(显示器)上输出信息。
标准输入
- 指针:stdin
- 设备:键盘
标准输出
- 指针:stdout
- 设备:显示器
标准错误
- 指针:stderr
- 设备:显示器
有了这个基础,可以暂时看作万物皆文件
例如
- 这两行代码本质上一样
1 | fprintf(stdout, "%s", string); |
- 这行的区别也只不过是写在标准错误上
1 | fprintf(strerr, "%s", string); |
Related Articles
2020-04-11
函数和指针
前言首先,了解两个不同的概念。 函数指针这是个指针。它指向函数的地址。 指针函数这是个函数。它用来返回指针。 声明函数指针指针有它所对应的类型,比如int*,int类型的指针。所以函数指针也有其类型。我们又知道,要将一个地址赋给一个指针,它们对应的类型要相同。 首先,函数的声明有两要素。(1)函数的返回值 (2)函数接收的参数的类型 如果有一个函数指针和一个函数,它们各自的两要素一样,这就可以让这个函数的地址赋给这个函数指针。 例如**声明函数指针时只需把(*pf)这个指针和ToUpper这个函数名换掉 函数声明:void ToUpper(char *);函数指针的声明:void (*pf)(char *); **这样一来,(*pf)当作ToUpper 注意 这里必须要将*pf用()括起来。如果不,就成了指针函数了。 在以后调用函数也要()括起来 使用 首先,我们要知道函数的地址怎么表示。数组就把数组名作为它的首元素地址。函数代码就把函数名作为函数起始处的地址。 赋函数地址给指针pf = ToUpper 怎么通过函数指针调用函数pf指针存有函数的地址,(*pf...
2020-03-20
枚举类型
前言enum Day{mon, tue, wed, thu, fir, sat, sun};枚举类型是为了减少繁多的整数定义。诸如mon(默认=0),tue这些是枚举符(int类型的常量)对应一个数字。 可以给枚举列表中的常量赋值 没有赋值的枚举符会根据前面被赋予的常量++ 概念mon, tue,把这些看作常量。 定义1234enum Day //Day是类型名,可不写{ mon, tue, wed = 1, thu, fir, sat, sun}day; //变量名 用法 给枚举变量赋值,然后输出 123456789101112enum Day{ mon, tue, wed, thu, fir, sat, sun};int main(){ enum Day day;//定义变量 day = tue; printf("%d", day); return 0;} 可以用for循环遍历元素(要依赖连续的++值,中间不能有赋值) 1...
2020-04-09
结构体声明和初始化
Introduction声明结构类型声明struct person{...}; 这个struct person起的作用就是一般声明中的int 例如:定义struct person类型的变量。struct person ferry, *pferry 声明过程与定义结构变量,可以组合成一个步骤。 12345struct /*无结构标记*/{ int a; int b;}library; 但如果要多次使用模板,就要加上标记。 1234567typedef struct BTNode{ char data; struct BTNode* lchild; struct BTNode* rchild;}BTNode; 这时编译器还没有在内存中分配空间。什么时候开始分配呢,当然是在初始化变量的时候。 初始化结构变量struct person ferry;这样就初始化了ferry这个变量,同时为该变量分配空间。当然,我们可以用这结构类型定义多个变量。这样就可以存储不同的信息。 初始化成员在刚开始声明结构中就有表明了要什么样的数据类型,再到...
2020-05-17
递归
DefinitionRecursion the process of repeating a function, each time applying it to the result of the previous stage. 经过树形结构,和嵌套结构后的思想:可像数学函数一样,一个个嵌套,完美解决递归 演示递归 debug1234567891011121314151617/* recur.c -- recursion illustration */#include <stdio.h>void up_and_down(int);int main(void){ up_and_down(1); return 0;}void up_and_down(int n){ printf("Level %d: n location %p\n", n, &n); // 1 if (n < 4) up_and_down(n+1); printf("LEVEL...
2020-04-07
fread()和fwrite()
了解这两个函数是以二进制形式处理数据中,不同于其他I/O函数,是以文本形式处理。 函数fread() 作用:将文件中的内容拷贝到数组中 参数:(地址,数据块,数据块个数,文件指针) 返回值:两种情况:1.返回文件中成功读取项的数量。2.遇到文件结尾返回0 fwrite() 作用:将n个数据块拷贝到文件中 参数(地址,数据块,数据块的个数,文件指针) 示例123456789101112131415161718192021222324252627282930313233#include<stdio.h>#include<stdlib.h>#define SIZE 256int main(int argc, char *argv[]){ FILE *in, *out; int bytes; char temp[SIZE]; if (argc != 3) { fprintf(stderr, "Usage: %s filename\n", argv[0]);...
2020-03-16
函数中参数(地址和变量)
前言函数中使用参数是否会改变主调函数中的变量?全局变量在函数如何改变?示例函数中的全局变量12345678int x = 1;int function(){ int x; x = 2; printf("%d, x); //x = 2;}printf("%d", x); //x = 1; 在块中,重新定义了局部变量x,(因为同名)所以全局变量暂时被覆盖。当跳出块时x变为全局变量。 1234567int x = 1;int function(){ x = 2; printf("%d, x); //x = 2;}printf("%d", x); // x = 2; 因为全局变量随处可用,所以可在块中修改x的值。所以全局变量很容易被修改,一般将固定值设为全局变量,使用const修饰。 函数中的参数。一般由主调程序将变量传给函数。 例如函数 1234int function(const int arr[], int x, int ...
