读写文件问题

ImAmelie 2014-08-14 07:35:27

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
if ((fp = fopen("a", "rb+")) == NULL)
{
printf("error");
exit(0);
}
char temp;
fseek(fp, 0, 2);
int length = ftell(fp);
rewind(fp);
while (ftell(fp) < length)
{
fread(&temp, 1, 1, fp);
fseek(fp, -1, 1);
fwrite(&temp, 1, 1, fp);
}
fclose(fp);
return 0;
}

a文件内容“abcdef”
运行之后 “bccccc”
为什么不是"bcdefg"????
...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-15
  • 打赏
  • 举报
回复
不要使用
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;
 //...
}
类似的例子还可以举很多。
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
707wk 2014-08-14
  • 打赏
  • 举报
回复
安装win8.1中。。。,暂时无法查看
我还在迷路 2014-08-14
  • 打赏
  • 举报
回复
没看明白你的程序意图是什么 加入a里面是“gfedcba”,你是希望执行完程序后变成“fedcba”还是“fghijkl”? 如果是后者,你的代码可以实现,但如果是前者,这个代码就不对了
sun_aigo 2014-08-14
  • 打赏
  • 举报
回复
这个我不是太清楚,测试了一会,在fwrite后加个fflush之后好像能用。
ImAmelie 2014-08-14
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp;
    if ((fp = fopen("a", "rb+")) == NULL)
    {
        printf("error");
        exit(0);
    }
    char temp;
    fseek(fp, 0, 2);
    int length = ftell(fp);
    rewind(fp);
    while (ftell(fp) < length)
    {
        fread(&temp, 1, 1, fp);
        temp++;
        fseek(fp, -1, 1);
        fwrite(&temp, 1, 1, fp);
    }
    fclose(fp);
    return 0;
}

69,371

社区成员

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

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