一、文件I/O
首先是最原始的read函数,其原型是ssize_t read(int fileds, void *buf, size_t nbytes);
若read 成功则返回读到的字节数,如达到文件结尾则返回0, 若读取出错则返回-1,通过errno设置错误码。
值得注意的地方是当读取普通文件时,如读到文件尾端不够设置的字节数,则返回读到的字节数,下次调用read时,则会返回0.
write函数与此类似,其原型是ssize_t write(int fileds, const void *buf, size_t nbytes);
二、标准库I/O
1、一次处理一个字符
在标准I/O库中,一次读一个字符的函数有三个:
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
三个函数若成功则返回下一个字符,若已达到文件尾或出错则返回EOF。
为了区分是出错还是到达文件尾端,对返回的EOF要进行判断,此时可以使用ferror或feof,其原型是:
int ferror(FILE *fp);
int feof(FILE *fp);
两个函数为真时返回非零值,否则返回0.
与上面相对应的一次写一个字符的函数也是三个:
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
三个函数若成功则返回c,若出错则返回EOF。
2、一次处理一行字符
每次读取一行的函数有两个:
char *fgets(char *restrict buf, int n, FILE *restrict fp);
char *gets(char *buf);
两个函数若若成功则返回buf,若已达到文件结尾或出错则返回NULL.
对于fgets,此函数一直读到换行符为止,但不超过n-1个字符,以null字符结尾被送入缓冲区。若文件中某行大于n-1个字符,则返回一个不完整的行,下次调用时再继续。
gets不推荐使用,因为使用gets时不能确定长度,有可能造成缓冲区溢出,发生意想不到的后果。
另外值得注意的是,读取的时候fgets会保留换行符,而gets则会自动删除换行符。
与此对应的每次输出一行的函数:
int fputs(const char *restrict str, FILE *restrict fp);
int puts(const char *str);
两个函数若成功则返回非负值,出错返回EOF。
fputs将一个以null符终止的字符串写到指定的流,null不写出,此时并不要求每次输出一行,不要求null前为换行符。
puts同样将null符终止的字符串写到标准输出,Null不写出,但是puts会将一个换行符写到标准输出。