A和B各存放一行字母,要求把信息按顺序排列,输出到C

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指针了。

— cloudxiao 2010,3,10

No Comments

Leave A Reply