读书人

fwrite有关问题,顺便散分

发布时间: 2012-03-12 12:45:33 作者: rapoo

fwrite问题,顺便散分

C/C++ code
#include<stdio.h>#include<stdlib.h>typedef struct{    int number;    char name[10];}student;void stu_scanf(student *stu,int n){    for(int i=0;i<n;i++)    {        printf("请输入学号和姓名:\n");        scanf("%d%s",&stu[i].number,stu[i].name);    }}int main(){    FILE *fp;    int i,j;    student stu[2],stud[2];    if((fp=fopen("1.txt","w"))==NULL)    {        printf("can't open 1.txt\n");        exit(0);    }    stu_scanf(stu,2);    for(i=0;i<2;i++)        fwrite(&stu[i],sizeof(student),1,fp);    fclose(fp);    if((fp=fopen("1.txt","r"))==NULL)    {        printf("can't open 1.txt\n");        exit(0);    }    i=0;    while(!feof(fp))    {        fread(&stud[i++],sizeof(student),1,fp);    }    fclose(fp);        for(j=0;j<i;j++)//此处I为何是3,fwrite到底多写入了什么东西?怎么解决        printf("%d\t%s\n",stud[j].number,stud[j].name);        return 0;}


[解决办法]
写了2行。
读的问题。
[解决办法]
我想应该是读文件时两次正好读到文件结尾的地方,第三次读feof才成立。
你还应该检查下fread的返回值。
[解决办法]
好象因为多了一个回车 所以可能会多读一次....
[解决办法]
当读到第2笔数据的时候,i为2,这个时候他没有到eof了,也就是还要再读一次,这个时候再读,才会有eof的存在,也就是i为3.
[解决办法]

[解决办法]
4字节以上对齐模式下
sizeof(student) = 0x10
也就是每写入和读入都应该是0x10个字节
写入2次就是文件长度总共0x20个字节

当读出时,
第一次未读时文件指示器偏移量为0
读完偏移量为0x10
第一次未读时文件指示器偏移量为0x10
读完偏移量为0x20

注意,此时并未到达文件末尾,还有一个字节呢!

前面楼上说的什么0x0d,0x0a根本不存在,写入的时候根本没有写入回车换行!

[解决办法]
戒指的这个解释好。还得继续学啊。0x0d,0x0a这个我也没有见到程序有在什么地方写,文件我也看了,也没有见有啊。比较奇怪5,6的说有0x0d,0x0a。
[解决办法]
四字节对齐,文件就是32字节的
偏移量为0x20(=32)的时候为啥最后还有一个字节呢?
[解决办法]
接分
[解决办法]
来了
[解决办法]
feof()的实现与平台有关。

在stdio.h中feof的定义:
#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)

由此可知,只有当fp->_flag & 0x0010为真时,才认为文件结束了。
在VC里,只有当file position indicator(在Windows上是fp->_ptr)到了文件末尾,
然后再发生读/写操作时,fp->_flag才会被置为含有_IOEOF,然后再调用feof(),
才会得到文件结束的信息。并不是file position indicator一指到文件尾,feof()就认为文件结束。
[解决办法]
又有学习,但还是不太明白。
[解决办法]
fwrite执行了两次写入操作
是feof的问题.

读书人网 >C语言

热点推荐