《C和指针》读书笔记(七)

来源:互联网 发布:java服务器性能监控 编辑:程序博客网 时间:2024/04/30 19:16

第十五章 输入输出函数

1. ANSI编译器并未被禁止在它们的库函数的基础上增加其他函数,但是标准函数必须根据标准所定义的方式执行。如果你关心可移植性,只要避免使用任何非标准函数就行了。

2.perror函数以一种简单、统一的方式报告错误。

 原型 void perror(char const* message);

 如果message不是NULL并且指向一个非空的字符串,perror函数就打印出这个字符串,后面跟一个分号和空格,然后打印出一条用于解释erron当前错误代码的信息。

3.原型 void exit(int status);

预定义符号EXIT_SUCCESS与EXIT_FAILURE分别提示程序的终止的成功还是失败;exit 函数中的参数和main中的参数状态是一致的,用于提示程序是否正常完成,这个函数没有返回值,当exit结束时,程序已经消失,所以他无返回值而言。

4. 这个函数库存在两个缺点:1。它在某种特定的类型的机器上实现的,并没有对其他不同特性的机器多作考虑。2.设计这发现上述问题后,试图去修正,但是只要他们这么作了这个函数库就不标准了,程序的可移植性就会降低。

5. 使用标准 输入输出时,这种缓存坑引起混淆,只有当他们与交互设备并无联系时,才会进行完全缓存。

6.标准I/O函数库中的函数,是对原来的函数进行诸多完善之后的结果,但是它们仍然可能进一步改进,使它们变得更完美。ANSI C的一个主要优点就是这些修改将通过增加不同函数的方法实现,而不是通过对现存函数进行修改来实现。因此,程序的可移植性不会受到影响。

7. I/O函数以三种基本的形式处理数据:单个字符、文本行和二进制数据;

a.只用stdin或stdout b.随作为参数的流使用 c.使用内存中的字符串而不是流

8.打开流。

FILE* fopen(char const* name,char const* mode);

name 是你希望打开的文件的名字。mode 分为“r”或“rb”,“w”或“wb”,“a”或“ab”。

使用打开流,始终检查fopen函数的返回值。如果函数失败,它会返回一个NULL值。

FILE* freopen(char const*filename,char const* mode,FILE* stream);

freopen函数用于打开(或重新打开)一个特定的文件流。最后一个参数就是需要打开的流。他可能是一个先前的从fopen函数返回的流,也可能是标准流stdin、stdout或stderr。

9.关闭流。

   int fclose(FILE* f);

   fclose函数在文件关闭之前刷新缓冲区。如果它执行成功,fclose返回零值,否则返回EFO。

10. 关于错误检查:

   在考虑错误检查的时候,思考两个问题:(1)如果操作成功应该执行什么?(2)如果操作失败应该执行什么?

如果两个问题的答案是不同的,应该进行错误检查,否则跳过错误检查才是合理的;

11.字符I/O

·  int fgetc(FILE *stream);

·  int getc(FILE *stream);

·  int getchar(void);

·  int fputc(FILE *stream);

·  int putc(FILE *stream);

·  int putchar(void);

注:它们都是返回一个int值而不是char值,是为了允许报告文件的末尾EOF;fgetc和fputc都是真正的函数,而getc、putc、getchar、putchar都是通过#define指令定义的宏;

12.未格式化I/O

char *fgets(char *buffer,int buffer_size,FILE *stream);

char *gets(char *buffer);

fgets是从指定的流读取字符串的,当读取到换行符或者缓冲区存储的字符数达到buffer_size-1时,停止读取并将一个NUL字节添加到数据的末尾,使之成为一个字符串,fgets读取到达了文件的末尾就返回一个NULL值,否则返回它的第一个参数(fgets无法把字符串读入到一个长度小于两个字符的缓冲区,因为其中一个用于NUL字节); gets无法判断缓冲区的长度,因此应该少用gets,当gets读取一行输入时,并不在缓冲区中存储结尾的换行符;

int fputs(char const* buffer,FILE* stream);

int puts(char const* buffer);

fputs如果写入错误时,返回EOF,否则返回一个非负值;使用fputs时,如果缓冲区中不包含一个换行符,就不会写入换行符,如果包含多个换行符,所有的换行符都会被写入;当puts写入一个字符串时,它在字符串写入之后向输出再添加一个换行符,而fputs则不会;

13.scanf家族

int fscanf(FILE* stream,char const* format,...);

int scanf(char const* format,....);

int sscanf(char const* string,char const* format,....);

fscanf输入源是作为参数给出的流,scanf从标准输入读取,sscanf从第一个参数所给出的字符串中读取字符;

format字符串参数可能包含以下内容:

(1)空白字符——处理中会被忽略

(2)格式代码——解释输入的字符

(3)其他字符——当任何其他字符出现在格式字符串中,下一个输入字符必须跟它匹配,如果匹配,该输入字符就被丢弃,否则函数就不再读取直接返回;

格式代码格式:

以一个%开头,(1)一个可选的星号(2)一个可选的宽度(3)一个可选的限定符(4)格式码

星号:使转换后的值被丢弃而不是存储(用于跳过不需要的输入字符);

宽度:用于限制将被读取用于转换的输入字符的个数,如果未给出宽度,函数就连续读入字符直到遇见输入中的下一个空白字符;

限定符:用于修改有些格式码的定义,目的是指定参数的长度;

格式码:用于指定输入字符如何被解释;

14.printf家族

int fprintf(FILE* stream,char const* format,...);

int printf(char const* format,...);

int sprintf(char* buffer,char const* format,...);

printf将结果输出到标准输出,fprintf将结果输出到任何流,sprintf将结果作为一个NUL结尾的字符串存储到特定的buffer中而不是写入流中;它们的返回值都是实际打印或存储的字符数;

printf的format参数与scanf一样。format中的格式代码:以一个%开头,(1)一个或多个标志字符(2)一个可选的最小字段宽度(3)一个可选的精度(4)一个可选的修改符(5)转换类型

原创粉丝点击