一.使用文件描述符,根据fd读写 fd:file descriptor
int fd = open("a.txt",0); //返回的是代表文件的文件描述符 char buf[1]; while(1){ size_t cout = read(fd,buf,1); //返回的是读取的字符数 if(count==0) break; printf(buf); } close(fd); //关闭由该文件描述符代表的那个文件
文件描述符是整数,从0开始递增。
其中0表示标准输入,即键盘输入,1表示标准输出,2表示标准错误输出
所以下面这一句表示从标准输入,即键盘输入中读取:
size_t count = read(0,buf,1);
问题:通过程序的运行,我们发现在键盘上输入后,屏幕并没有马上输出,而是要输入个回车后才输出
解释:在键盘输入后,shell显示了你输入的内容,当你敲了回车后,操作系统才将shell显示的内容写入0号文件,再从0号文件中读取
二.通过fp:file pointer 操作文件
FILE * fp = fopen("a.txt","r"); //获取指向文件的指针 int count = fread(buf,1,1,fp); //从指针指向的文件中读
从前面可以想到,也有从标准输入中读,是这样写的:
int count = fread(buf,1,1,stdin);
写到标准输出:
fprintf(stdout,"a");
补充:所以我们一般写的printf其实就是打开1号文件,进行标准输出
小细节:
看这样两行代码:
fprint(stdout,"a"); fprint(stderr,"b");
先标准输出a,再标准错误输出b,但输出结果是:ba
解释:因为标准输出的内容先放入缓存,缓存不会马上输出,而标准错误输出的优先级别很高,所以先输出了
缓存中输出的条件:
1.缓存区满
2.回车
3.flush(stdout);
4.程序结束
所以如果程序是这样的:
fprint(stdout,"a\n"); fprint(stderr,"b");
输出结果就是:ab
例子:
int i; for(i = 0;i < 10;i++) putc('0'+i,i%2?stderr:stdout);
输出结果:1357902468
三.
fgetc 从文件中获取一个字符
fgets 从文件中获取多个字符
getchar 从标准输入中读一个字符
gets 从标准输入中读多个字符
四.
第一种和第二种操作文件的方式可以相互转换
fd = fileno(fp); //将filepointer转化为一个文件描述符 fp = fdopen(fd); //将一个文件描述符转化为一个指向该文件的指针