学习笔记(7):C程序设计(第四版)谭浩强著_第十章~第十一章

来源:互联网 发布:demo演示软件 编辑:程序博客网 时间:2024/05/18 22:44

第十章:对文件的输入输出

文件
    在程序设计中,主要用到两种文件:程序文件和数据文件。程序文件的内容是程序代码,数据文件的内容是供程序运行时读写的数据。
    操作系统会将各种设备都统一作为文件处理。文件一般是指存储在外部介质上数据的集合。操作系统是以文件为单位对数据进行管理的。输入输出是数据传输的过程,形象的被称为数据流。
    C语言把文件看作是一个字符(或字节)的序列,一个输入输出流就是一个字符流或字节流,内容是二进制数据。
    
    流式文件:由一连串的字符或字节组成,不考虑行的界限,两行数据间不会自动添加分隔符,对文件的存取以字符或字节为单位,输入输出流的开始和结束仅受程序控制而不受物理符号的控制。
    
    根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。数据在内存中以二进制形式存储,如果不加转换的输出到外存,就是二进制文件;如果转换为ASCII代码形式存储,则是ASCII文件。ASCII文件又称文本文件,一个字节放一个字符的ASCII码。如整数10000的二进制形式是00000000 00000000 00100111 00010000,而其ASCII形式是00110001 00110000 00110000 00110000 00110000,每个字节分别代表一个数字。
    
缓冲文件系统:指系统自动在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区,从内存向磁盘输出数据必须先送到内存中的缓冲区,在装满缓冲区后才一起送到磁盘中。

文件类型指针:即FILE类型指针,指向一个文件信息区,与特定的文件关联,用来存放如文件名、文件状态等信息。

文件的打开和关闭
    打开:实际上是为文件建立相应的信息区,存放有关文件的信息,以及建立文件缓冲区,用来暂时存放输入输出的数据。
    
    用fopen打开文件

fopen(文件名, 文件使用方式);
        例如: 
if ((fp = fopen("file", "r")) == NULL){    printf("Can not open this file\n");    exit(0);}
        通常将fopen的返回值赋给一个文件指针变量。文件打开方式如下表:


    
    用fclose函数关闭文件
        关闭其实就是撤销文件信息区和文件缓冲区,使文件指针不再指向该文件。调用方式是
        fclose(文件指针);
        当文件被正确关闭时,fclose返回0,否则返回EOF(-1)。
        
顺序读写数据文件
    读写字符:


    

    读写字符串:


    用格式化的方式读写文件:

fprintf(文件指针, 格式化字符串, 输出表列);fscanf(文件指针, 格式化字符串, 输入表列);
    用二进制的方式向文件读写一组数据: 
fread(buffer, size, count, fp);fwrite(buffer, size, count, fp);
        
随机读写数据文件
    不是按数据在文件中的物理位置次序进行读写,而是对任何位置上的数据进行访问。
    
    文件位置标记:指向接下来要读写的字符的位置。
    
    随机读写的实现就是靠人为调整文件位置标记完成的。
    (1) 用rewind哈思楠使文件位置标记指向文件开头;
    (2) 用fseek函数改变文件位置标记,用法:
          fseek(文件类型指针, 位移量, 起始点);
          起始点分别是文件开始位置(SEEK_SET),文件当前位置(SEEK_CUR),和文件结尾位置(SEEK_END)。位移量是指以起始点为基点,向前移动的字节数。位移             量应是Long型数据。

    (3) 用ftell函数测定文件位置标记的当前位置,是相对于文件开头的位移量。用法:   

long i;i = ftell(fp);
          ftell在出错时返回-1L。
        
文件读写的出错检测
    ferror函数:        ferror(fp);
        如果ferror返回值为0,表示未出错,返回非零值,则表示出错。
    clearerr函数:   clearerr(fp);
        作用是使文件错误标志和文件结束标志置为0。假设在调用一个输入输出函数时出现错误,ferror函数值返回非零值,则应该调用clearerr使ferror的值变成0,以便进行下一次检测。
    只要出现文件读写错误标志,它就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何一个输入输出函数。


第十一章:常见错误分析

(1) 忘记定义变量;变量在使用前一定要先定义。
(2) 输入输出数据的类型与用户指定的输入输出格式声明不一致,如a已定义为整型,而用了printf("%f", a);  当然某些是用户故意需要这样的结果,这是可以的。如打印字母的ASCII码。
(3) 未注意变量的数值范围,超出所能表达的范围则会溢出。
(4) 在使用scanf时忘记对变量使用取地址符&。
(5) 输入数据的形式与要求不符,如使用了scanf("%d%d", a&, &b);  在输入时却这样:3,4。
(6) 在用scanf函数向字符数组输入数据时,在数组名前多加了取地址符&。数组名前是不用加取地址符的。
(7) 在用scanf函数向数值型数组输入数据时,使用数值型数组名。如
int a[20];
scanf("%d", a);
    对字符数组,可以用%s限定后直接用数组名输入一个字符串,而数值型数组不允许这样做。
(8) 语句后面漏加了分号,或语句后多加了分号。
(9) 预处理指令后面加了分号。
(10) 复合语句忘记用花括号括起。
(11) 括号不匹配、if else不匹配等。
(12) 用标识符时混淆大小写字母。
(13) 将判断是否相等的关系运算符“==”误写作“=”。
(14) 引用数组元素时误用了圆括号。
(15) 定义数组时将元素个数误以为是下标的最大值。注意数组的下标是从0开始的,数组元素个数比可使用的数组下标最大值大1。
(16) 混淆字符数组与字符指针的区别。

int main(){    char str[4];    str="CCC";    printf("%s\n", str);}
         这样是不对的,str是数组名,代表数组首地址,在程序运行期间不能被再赋值。将char str[4]改为char* str就可以了。
(17) 在引用指针变量之前未经初始化,没有赋予确定的值。
(18) switch语句中各分支漏写了break语句。
(19) 注意,字符是用单引号括起的,字符串是用双引号括起的。
(20) 注意自加自减运算符的使用。
(21) 忘记对所调用的函数进行声明,或声明与函数定义不匹配。
(22) 函数传参时需要注意该改变的值是否改变,不该改变的值是否没变。函数的实参和形参类型也要一致。
(23) 注意运算符的优先级和结合性。
(24) 内存的申请与释放要配对出现,文件的打开和关闭要配对出现。

原创粉丝点击