stdin和STDIN_FILENO的区别:
层次不一样。STDIN 属于标准库处理的输入流,其声明为 FILE 型的,对应的函数前面都有f开头,如fopen/fread/fwrite/fclose 标准库调用等,在 <stdio.h>。
STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用。在 <unistd.h>。
标准库内封装了系统 API 调用,如 fread 内部实现调用 read。
open和fopen的区别:
后者属于低级IO,前者是高级IO。
后者返回一个文件描述符(用户程序区的),前者返回一个文件指针。
后者无缓冲,前者有缓冲。
NULL EOF NUL '/0'区别:
NULL: 定义为0或0L或(void *)0,用于指示一个指针值是空,即什么都不指;
'/0': 用且只用字符串结束符;
NUL : 0x00,0值字符,可以用于结束ASCII字符串,和'/0'类似,但是在c/c++中没有定义,如果要使用的话,需要自定义为 #define NUL '/0';
EOF :通常定义为-1, 文件结束符标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,ASCⅡ代码的范围是0到255,不可能出现-1,因此可以用EOF作为文件结束标志。
当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。
fprintf(stderr,"error and exit!/n");
fprintf(FILE ,"text content");
fread();
fwrite();
feof(FILE)使用注意:
//main.c linux 下编译通过。
与EOF的区别
在stdio.h中可以看到如下定义:
会发现多输出了一个FF,原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FF)。
正确的写法应该是:
feof()可以用EOF代替吗?不可以。fgetc返回-1时,有两种情况:读到文件结尾或是读取错误。因此我们无法确信文件已经结束, 因为可能是读取错误! 这时我们需要feof()。
读写I/O stream
getchar = getc(stdin) 说明stdin ,stderrr,stdout是 FILE *
int ferror(FILE *fp);
int feof( FILE *fp);
若条件为真则范围非零值,否则返回0
输出函数: