《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)转换类型
- 《C和指针》读书笔记(七)
- 《c和指针》(七)
- C和指针 七
- 《C和指针》 读书笔记
- 《C和指针》读书笔记
- 《C和指针》读书笔记
- 读书笔记---C和指针
- C和指针读书笔记
- C和指针 读书笔记
- C和指针 - 读书笔记
- 《C和指针》读书笔记
- 《C和指针》读书笔记
- 读书笔记 C和指针
- 《C和指针》读书笔记
- 《C和指针》-读书笔记
- C和C指针读书笔记
- 读书笔记之c和指针(1)
- 读书笔记之c和指针(2)
- POJ刷题注意事项
- [BZOJ1072][SCOI2007]排列perm(状压dp)
- 《C和指针》读书笔记(五)
- static和const关键字
- 《C和指针》读书笔记(六)
- 《C和指针》读书笔记(七)
- Spring MVC源码分析—基于Java中Socket实现HTTP协议
- 《C和指针》读书笔记(八)
- xml的增删改查,使用dom解析
- 《C和指针》读书笔记(九)
- java数据类型转换新手易错
- bzoj1567: [JSOI2008]Blue Mary的战役地图
- [LeetCode] 561.Array Partition I
- windows安装numpy简单安装方法