c文件操作中的问题

Guitarf 2017-03-12 11:11:05
#include<stdio.h>
#include<stdlib.h>
int main(){
int a[5]={1,2,3,4,5};
int i=0,t;
FILE *fp;
fp=fopen("c.txt","wb+");
if(fp==NULL)
{
printf("ERROR");
exit (0);
}
fwrite(&a[0],4,1,fp);
for(i=1;i<5;i++)
{
fseek(fp,0l,0);
fwrite(&a[i],4,1,fp);

}
fseek(fp,0l,0);
while(!feof(fp)){
fread(&t,4,1,fp);
printf("%d\t",t);
}
fclose(fp);
return 0;

}
题目答案说这个会把数组内容倒序保存,,不是应该每次文件指针指向头,每次只有头部分才改变,,不过我调试是 两个5 ,,不应该是一个5??求大大解答
...全文
115 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-13
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
自信男孩 2017-03-13
  • 打赏
  • 举报
回复
实际上也只读到了一个5,原因是t的值保存的上次读到的5,这次没读成功。你可以通过一下方式验证一下我的推测:
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int a[5] = {1,2,3,4,5};
    int i = 0, t, ret;
    FILE *fp;

    fp=fopen("c.txt","rb+");
    if(!fp) {
        printf("ERROR");
        exit (0);
    }
    fwrite(&a[0], 4, 1, fp);
    for (i = 1; i < 5; i++) {
        fseek(fp, 0l, SEEK_SET);
        fwrite(&a[i], 4, 1, fp);

    }
    fseek(fp, 0l, SEEK_SET);
    while(!feof(fp)){
        ret = fread(&t,4,1,fp);
        printf("ret = %d, %d\t", ret, t);
        t = 0;
    }
    fclose(fp);
    return 0;

}
原因出在feof,参考一下这个文章: http://blog.csdn.net/qq_29350001/article/details/53100563
Guitarf 2017-03-13
  • 打赏
  • 举报
回复
引用 1 楼 自信男孩的回复:
实际上也只读到了一个5,原因是t的值保存的上次读到的5,这次没读成功。你可以通过一下方式验证一下我的推测:
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int a[5] = {1,2,3,4,5};
    int i = 0, t, ret;
    FILE *fp;

    fp=fopen("c.txt","rb+");
    if(!fp) {
        printf("ERROR");
        exit (0);
    }
    fwrite(&a[0], 4, 1, fp);
    for (i = 1; i < 5; i++) {
        fseek(fp, 0l, SEEK_SET);
        fwrite(&a[i], 4, 1, fp);

    }
    fseek(fp, 0l, SEEK_SET);
    while(!feof(fp)){
        ret = fread(&t,4,1,fp);
        printf("ret = %d, %d\t", ret, t);
        t = 0;
    }
    fclose(fp);
    return 0;

}
原因出在feof,参考一下这个文章: http://blog.csdn.net/qq_29350001/article/details/53100563
蟹蟹 很有用 我觉得书上的答案解析是错了 他说把数组的内容倒序保存在文件里 结果我后来用循环输出文件内容也没有啊?求解答
Guitarf 2017-03-13
  • 打赏
  • 举报
回复
引用 2 楼 赵4老师的回复:
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
蟹蟹指导 知道问题在哪了

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧