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和指针 (pointers on C)——第十五章:输入输出函数,布布扣,bubuko.com

时间: 2024-10-13 01:08:02

C和指针 (pointers on C)——第十五章:输入输出函数的相关文章

C和指针 (pointers on C)——第五章:操作符和表达式

第五章 操作符和表达式 这一章如果没做过玩过单片机.汇编的话,读起来可能比较吃力,尤其是在移位运算符.位运算符应用上.另外多注意一下左值和右值的理解. 总结: 算术操作符.赋值操作符.关系操作符.条件操作符. 短路求值(short-circuited evalution):如||这样的二目操作符,如果它的左操作数是真,右操作数便不再求值.带来的后果是如果右操作数的数组下标不合法,那么也不会报错. C并不具备显式得布尔类型,布尔值是用整型表达式来表示的.在表达式中混用布尔值和任意的整型值可能会产生

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文

第十五章 链表

/** 数组与链表的区别:数组易随机访问,链表易插入和删除 链表组成:储存数据元素的数据域,储存下一结点地址的指针域 链表易于插入与删除 lists 的用法????????????????????? *///建立一个图书链表 #include<iostream> #include <string> using namespace std; struct book //第一步: 用于建立节点. class 默认为私有 struct 默认为公有 //节点组成:①数据域 ②指针域(*ne

C++ Primer Plus学习:第十五章

第十五章 友元.异常和其他 友元 友元类 表 0-1 class Tv { public: friend class Remote; } Remote类可以使用Tv的数据成员,Remote类在Tv类后定义 . 友元成员函数 表 0-2 class Tv; //前向声明 class Remote { public: void chanup(Tv &t); } class Tv { public: friend void Remote::set_chan(Tv& t, int c); } 异常

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

java(第十五章)

第十五章 一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名=new String("值"); 3.字符串的常用方法 3.1 字符串长度--length() 3.2 判断值是否相等 equals() 3.3 判断字符串对象地址是否相同 == 3.4 忽略 大小写 判断 equalsIgnoreCase() 3.5 大小写转换 toLowerCase(

CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

第十五章 文正学院成绩录入系统

这是13年上半年给文正学院做的一个成绩录入系统,只需要实现成绩录入的功能,嫁接到文正教务系统中.实现的功能如图所示. 王川 2014/5/30 第十五章 文正学院成绩录入系统,布布扣,bubuko.com

Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/usergu