我们之前见的所有文件都是文本文件(虽然我们也没见很多文件.),我们的输入输出都是文本方式的,你想,我们打印一个整数的时候,实际上是把这个整数格式化输出了.
我们来看一段演示的代码:
我们首先在一个.h文件里声明了一个结构类型Student和一个用于表示数组大小的变量STR_LEN.
在这个main里面,我们先让用户输入有多少个学生, 它输入个number,我们就建了这个STUDENT结构的一个数组.然后我们调用那个getlist函数,我们做了一个循环遍历整个数组,用于信息的录入.值得一讲的是这个sprintf.我们之前见过了printf,它向标准输出做输出,和fprintf,它向文件输出.而这个sprintf则是向一个字符串输出.我们做了一个字符数组,这个数组的大小是20.然后我们往这个字符数组里输出东西.%%%ds是它的格式.%%表示我要输出一个百分号,s是要输出的那个字符,而%d呢是后面的那个值.所以这个东西最后给出来实际上是这样的,"%19s",即最多输出19个字符.这样呢这个getlist调用完我们就得到了一个数组,这个数组里面有number个学生的数据.
回到main,我们去调用save函数,save做的事情是这样,我们打开了一个叫student.data的文件,然后我们要写这个文件,如果打开成功,我们就用fwrite把number个sizeof(Student)那么大的astu数组写到fp里去,写完之后我们就把它关掉了.然后如果fwrite返回的结果是number,那么就说明我们写进去的东西是对的,那它就会返回1,否则就返回0.
我们再来看一段示例的代码:
我们首先打开了student.data文件,刚才是w的,现在我们是r的,我们要打开来读.然后如果打开成功,我们先fseek到seek_end,fseek的意思是,把我们读写的位置移到什么地方去,seek_end表示说从尾巴上开始,往前倒过来算,0L的意思是文件位置指针从文件末尾向后移动0个字节,就是在文件末尾不动.所以这个语句执行完之后我们当前的位置就在尾巴上了.
然后我们再用ftell来得到现在所在的那个位置,也就是说,我从尾巴上得到的那个位置其实是什么,其实表达的就是这个文件的大小.然后再用得到的这个size除以每个结构体的大小,结果我们就可以得到说,在这个文件里面有多少个student的数据.然后再输出说有几个数据,你要看第几个.然后读进来一个index,把index-1(为什么要减1?这是为了匹配数组下标,如当你输入1的时候,会自动转成数组的第一个单元,它的下标为0.)交给read函数.
然后调用read函数,我们用fseek,从seekset,也就是这个文件的头, 往前走到index个该结构体大小的位置.到了那个位置上以后,去把它读出来,我读一个student的结构,读出来,然后把里面的信息都输出出来给我们看.