A和B各存放一行字母,要求把信息按顺序排列,输出到C
10
Mar
0
有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | int main(void) { FILE * fp1, * fp2, * fp3; if((fp1=fopen("a.txt", "r"))==NULL) exit(0); if((fp2=fopen("b.txt", "r"))==NULL) exit(0); if((fp3=fopen("c.txt", "w"))==NULL) exit(0); char ch[20], c; int i=0, n; for(i=0; (c=fgetc(fp1))!=EOF; i++) { ch[i]=c; putchar(ch[i]); } for(i; (c=fgetc(fp2))!=EOF; i++) { ch[i]=c; putchar(ch[i]); } n=i; for (i=0; i for(int j=i+1; jch[j]) { char temp; temp=ch[j]; ch[j]=ch[i]; ch[i]=temp; } } for(i=0; i { putc(ch[i],fp3); } fclose(fp1); fclose(fp2); fclose(fp3); return 0; } |
开始使用了feof来判断磁盘文件的结尾,却总是出问题。仔细搜索一下才发现feof这个函数本身就让很多人误解,来看看网络上的解释:
“C”语言的“feof()”函数和数据库中“eof()”函数的运做是完全不同的。数据库中“eof()”函数读取当前指针的位置,“C”语言的“feof()”函数返回的是最后一次“读操作的内容”。多年来把“位置和内容”相混,从而造成了对这一概念的似是而非。
那么,位置和内容到底有何不同呢?举个简单的例子,比如有人说“你走到火车的最后一节车箱”这就是位置。而如果说“请你一直向后走,摸到铁轨结果”这就是内容。也就是说用内容来判断会“多走一节”。这就是完全依赖于“while(!feof(FP){…}”进行文件复制时,目标文档总会比源文档“多出一些”的原因。
看了别人的代码才发现原来判断用EOF更加合适,这也解释了为什么最后我输出的文件总是多占几个字符。另外,我看到有一种更简写代码的方式,也就是不必设置那么多文件指针。只需要设置一个,然后打开文件后即像数组拷贝,结束后关闭指针再新打开即可,这样就不必设置三个fp指针了。
Filed Under: 职业生涯
No Comments