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的问题.