I/O函数以3种基本形式处理数据:单个字符,文本行,二进制数据。
fscanf()
int fseek(FILE *stream, long offset, int from)
在二进制流中,
从SEEK_END进行定位可能不被支持。
在文本流中,
如果from是SEEK_CUR或者SEEK_END,offset必须是0。
如果from是SEEK_SET,offset必须是同一个流ftell()返回值。
文本流有这些限制的原因是:
由于文本流所执行的行末字符映射,文本文件的字节数肯能和程序写入的字节数不同。
fclose()
如果对fclose()的返回值不进行检查,会出现什么问题呢?
如果fclose()出错,那很有可能你写的程序有问题,比如说传给fclose()的参数是不对的。这样有可能会出现,真正fopen的流没有释放掉。
每个进程能够打开的流的个数是有限的,如果一直打开流但是关闭流一直失败的话,后面这个进程就没有办法再打开流了。
sprintf()
sprintf(buffer, "%d %c %x"); 如果整数的长度是2个字节。那么buffer应该多大?
%d : 两个字节整数的范围-32768~ 32767,或者0 ~ 65535,所以最长需要6个字节(-32768)
%c : 一个字节
%x : FFFF, 两个字节
两个空格:两个字节
结尾NUL : 一个字节
6 + 1 + 4 + 2 + 1 = 14个字节
fopen()
不希望文件原先的内容丢失,也希望能够写入文件的任何位置,那应该r+模式打开文件。