首页 > 代码库 > C和指针 (pointers on C)——第十五章:输入输出函数
C和指针 (pointers on C)——第十五章:输入输出函数
第十五章 输入输出函数
这一章读完的第一感觉就是“呵呵”。
如果说上过C语言课,基本上scanf()/printf()算是用的比较熟练了。尤其是那些抽象的格式说明。还有scanf()为什么要加括号。
读过本书前面的内容的话,getchar(),putchar(),gets(),puts()这些应该也问题不大。
再如果的话,你学过计算机图形学,你玩过OpenGL,听说过双缓存机制,那么fflush()也肯定弄明白了。
再加上FILE的操作,输入输出定位刷新删除改名,流的概念。
这一章就会把这些串起来讲。内容非常的多,我读的也是走马观花的感觉。
总结:
perror(char const *message);和exit(int status);这两条语句前者是生成一个错误报告。后者就比较重要,后者会终止程序。预定义符号EXIT_SUCCESS和EXIT_FAILURE分别提示程序的终止是成功还是失败。
所有的I/O的库函数都在stdio.h里面。I/O接口都是流,文本流,二进制流。
FILE是一种数据结构,管理缓冲区和存储流的状态。包括标准输入、标准输出和标准错误。
对文件操作:先用fopen()函数打开文件,返回一个指向FILE结构的指针,这个FILE结构指派给进行操作的流进行操作,指针类型必需为FILE *。有一些参数的模式,你可以指定它为二进制流还是文本流传输。在文件结束的时候用fclose()来关闭。
这里面有许许多多的I/O函数,其实都是有一些微小的差别,本质上执行相同的任务。
对字符操作:getchar(),putchar()为逐个字符的实现,只从标准输入读取。fgetc(),getc()都接受一个流参数。fputc(),putc(),putchar()具有和对应的输入函数相同的属性。ungetc()用于把一个不需要的字符退回到流中,用的不多。
对行操作:既可以是格式化的,也可以是未格式化的。gets和puts函数家族执行未格式化的行I/O。fgets和gets都从一个指定的缓冲区中读取一行,前者包括一个流参数,后者从标准输入读取。fgets函数更为安全,因为它包含一个缓冲区的长度参数,一旦超过这个长度值命令就会停止操作,但是gets这么看就像个玩具,它会一直一直读缓冲区,溢出也完全停不下来。fputs和puts函数把文本写入到流中。gets将去除它所读取的行换行符,puts函数在写入到缓冲区的文本后面加上一个换行符。
scanf和printf函数也执行格式化的I/O操作。
scanf从标准输入读取,fscanf接受一个流参数,sscanf从一个内存中的缓冲区接受字符。
printf跟以上一样。
对二进制流操作:比使用字符的效率更高,fread和fwrite是函数执行二进制I/O操作。均包含四个参数:指向缓冲区的指针,缓冲区每个元素的长度、需要读写的元素个数以及需要操作的流。
警告:
1、不检查fopen函数的返回值。
你应该是种检查fopen函数的返回值!如果函数失败,它会返回一个NULL值。如果程序不检查错误,这个NULL指针就会传给后续的I/O函数。它们将对这个指针执行间接访问,并将失败。
FILE *input;
input = fopen("data3", "r");
if(input == NULL)
{
perror("data3");
exit(EXIT_FAILURE);
}
首先,fopen函数被调用,这个被打开的文件名叫data3,打开用于读取。然后对返回值进行检查。
如果错误就会: data3:No such file or directory
2、改变文件的位置将丢弃任何被退回到流的字符。
3、在使用fgets时指定太小的缓冲区。
fgets指定太小的缓冲区的话,会丢失数据。
4、使用gets的输入溢出缓冲区且没有被检测到。
gets是不会检测溢出的,而溢出的后果你懂得。
5、使用任何scanf系列函数时,格式代码和参数指针类型不匹配。
scanf相当于你把一个参数通过指针传递给函数,所以参数的指针必须对。
6、在任何scanf系列函数的每个非数组、非指针参数前往了加上&符号。
7、sprintf函数的输入溢出了缓冲区且未被检测到。
见上!
8、混淆printf和scanf格式代码。
9、在有些长整数长于普通整数的机器上打印长整数值时,忘了在格式代码中指定l修订符。
10、使用自动数组作为流的缓冲区时应该多加小心。
编程提示:
1、在可能出现错误的场合,检查并报告错误。
这个提示其实意义不大,错误报告很难记下来。起码是现阶段。
2、操作文本行而无需顾及它们的外部表示形式这个能力有助于提高程序的可移植性。
3、使用scanf限定符提高可移植性。
4、当你打印长整数时,即使你所使用的机器并不重要,坚持使用l修改符可以提高可移植性。
这一章读完的第一感觉就是“呵呵”。
如果说上过C语言课,基本上scanf()/printf()算是用的比较熟练了。尤其是那些抽象的格式说明。还有scanf()为什么要加括号。
读过本书前面的内容的话,getchar(),putchar(),gets(),puts()这些应该也问题不大。
再如果的话,你学过计算机图形学,你玩过OpenGL,听说过双缓存机制,那么fflush()也肯定弄明白了。
再加上FILE的操作,输入输出定位刷新删除改名,流的概念。
这一章就会把这些串起来讲。内容非常的多,我读的也是走马观花的感觉。
总结:
perror(char const *message);和exit(int status);这两条语句前者是生成一个错误报告。后者就比较重要,后者会终止程序。预定义符号EXIT_SUCCESS和EXIT_FAILURE分别提示程序的终止是成功还是失败。
所有的I/O的库函数都在stdio.h里面。I/O接口都是流,文本流,二进制流。
FILE是一种数据结构,管理缓冲区和存储流的状态。包括标准输入、标准输出和标准错误。
对文件操作:先用fopen()函数打开文件,返回一个指向FILE结构的指针,这个FILE结构指派给进行操作的流进行操作,指针类型必需为FILE *。有一些参数的模式,你可以指定它为二进制流还是文本流传输。在文件结束的时候用fclose()来关闭。
这里面有许许多多的I/O函数,其实都是有一些微小的差别,本质上执行相同的任务。
对字符操作:getchar(),putchar()为逐个字符的实现,只从标准输入读取。fgetc(),getc()都接受一个流参数。fputc(),putc(),putchar()具有和对应的输入函数相同的属性。ungetc()用于把一个不需要的字符退回到流中,用的不多。
对行操作:既可以是格式化的,也可以是未格式化的。gets和puts函数家族执行未格式化的行I/O。fgets和gets都从一个指定的缓冲区中读取一行,前者包括一个流参数,后者从标准输入读取。fgets函数更为安全,因为它包含一个缓冲区的长度参数,一旦超过这个长度值命令就会停止操作,但是gets这么看就像个玩具,它会一直一直读缓冲区,溢出也完全停不下来。fputs和puts函数把文本写入到流中。gets将去除它所读取的行换行符,puts函数在写入到缓冲区的文本后面加上一个换行符。
scanf和printf函数也执行格式化的I/O操作。
scanf从标准输入读取,fscanf接受一个流参数,sscanf从一个内存中的缓冲区接受字符。
printf跟以上一样。
对二进制流操作:比使用字符的效率更高,fread和fwrite是函数执行二进制I/O操作。均包含四个参数:指向缓冲区的指针,缓冲区每个元素的长度、需要读写的元素个数以及需要操作的流。
警告:
1、不检查fopen函数的返回值。
你应该是种检查fopen函数的返回值!如果函数失败,它会返回一个NULL值。如果程序不检查错误,这个NULL指针就会传给后续的I/O函数。它们将对这个指针执行间接访问,并将失败。
FILE *input;
input = fopen("data3", "r");
if(input == NULL)
{
perror("data3");
exit(EXIT_FAILURE);
}
首先,fopen函数被调用,这个被打开的文件名叫data3,打开用于读取。然后对返回值进行检查。
如果错误就会: data3:No such file or directory
2、改变文件的位置将丢弃任何被退回到流的字符。
3、在使用fgets时指定太小的缓冲区。
fgets指定太小的缓冲区的话,会丢失数据。
4、使用gets的输入溢出缓冲区且没有被检测到。
gets是不会检测溢出的,而溢出的后果你懂得。
5、使用任何scanf系列函数时,格式代码和参数指针类型不匹配。
scanf相当于你把一个参数通过指针传递给函数,所以参数的指针必须对。
6、在任何scanf系列函数的每个非数组、非指针参数前往了加上&符号。
7、sprintf函数的输入溢出了缓冲区且未被检测到。
见上!
8、混淆printf和scanf格式代码。
9、在有些长整数长于普通整数的机器上打印长整数值时,忘了在格式代码中指定l修订符。
10、使用自动数组作为流的缓冲区时应该多加小心。
编程提示:
1、在可能出现错误的场合,检查并报告错误。
这个提示其实意义不大,错误报告很难记下来。起码是现阶段。
2、操作文本行而无需顾及它们的外部表示形式这个能力有助于提高程序的可移植性。
3、使用scanf限定符提高可移植性。
4、当你打印长整数时,即使你所使用的机器并不重要,坚持使用l修改符可以提高可移植性。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。