69,371
社区成员
发帖
与我相关
我的任务
分享
#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;
}
不要使用
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执行停在该断点处。)是程序员必须掌握的技能之一。
#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;
}