使用 C 中的文件管理陷入循环
Stuck in a loop using file management in C
节目是:
两个文件 DATA1 和 DATA2 包含排序的整数列表/编写一个程序来生成第三个文件 DATA,它包含这两个列表的单个排序合并列表。使用命令行参数指定文件名。
#include<stdio.h>
//Two files DATA1 and DATA2 contain sorted lists of integers/ Write a program to produce a third file DATA which holds a single sorted, merged list of these two lists. Use command line arguments to specify the file names.
void sort(FILE*, FILE*, FILE*);
main()
{
FILE *f1, *f2, *f;
int i;
f1=fopen("DATA1", "w"); //To set the sorted integers in file f1
for(i=0;i<=10; i=i+2)
putw(i, f1);
fclose(f1);
f2=fopen("DATA2", "w"); //To set the sorted integers in file f2
for(i=1;i<=11; i=i+2)
putw(i, f2);
fclose(f2);
printf("For first DATA:\n"); //To print the content of f1
f1=fopen("DATA1", "r");
while((i=getw(f1)) != EOF)
printf("%d, ", i);
fclose(f1);
printf("\nFor second DATA:\n"); //To print the content of file f2
f2=fopen("DATA2", "r");
while((i=getw(f2)) != EOF)
printf("%d, ", i);
fclose(f2);
sort(f1, f2, f); //To sort the integers from f1 and f2 and merge the sorted into file f
f=fopen("DATA", "r"); //To print the integers in file f
while((i=getw(f)) != EOF)
printf("%d, ", i);
fclose(f);
}
void sort(FILE *d1, FILE *d2, FILE *d)
{
int a, b;
d1=fopen("DATA1", "r");
d2=fopen("DATA2", "r");
d=fopen("DATA", "w");
a=getw(d1);
b=getw(d2);
for(;some condition;)
{
if(a>b)
{
int temp=a;
a=b;
b=temp;
b=getw(d2);
putw(a, d);
b=getw(d2);
}
else
{
putw(a, d);
a=getw(d1);
}
}
fclose(d1);
fclose(d2);
fclose(d);
}
现在程序在gcc编译器中使用命令"gcc file.c"编译。当我 运行 程序编译后,它显示文件 f1 的内容而不是文件 f2 的内容。我似乎陷入了循环,因为 Ctrl + D 不起作用。所以我必须终止程序。
输出为:
For first DATA:
0, 2, 4, 6, 8, 10,
For second DATA:
^Z
[6]+ Stopped ./a.out
现在这里有什么问题。我打印 f2 的整数的方式与打印 f1 的整数的方式相同,但为什么问题只出现在文件 f2 中?
您的代码应输出:
For first DATA:
0, 2, 4, 6, 8, 10,
For second DATA:
1, 3, 5, 7, 9, 11,
这就是您所需要的。我怀疑错误发生在不久之后,输出缓冲区没有及时刷新,因此数据保留在那里,没有显示在标准输出中(很可能是你的屏幕)。
将您的代码更改为:
printf("\nFor second DATA:\n"); //To print the content of file f2
f2=fopen("DATA2", "r");
while((i=getw(f2)) != EOF)
printf("%d, ", i);
fclose(f2);
printf ("\n");
fflush(stdout);
sort(f1, f2, f);
明白我的意思了。换行符刷新输出缓冲区本身,因此您可以使用任何一种方法。
节目是:
两个文件 DATA1 和 DATA2 包含排序的整数列表/编写一个程序来生成第三个文件 DATA,它包含这两个列表的单个排序合并列表。使用命令行参数指定文件名。
#include<stdio.h>
//Two files DATA1 and DATA2 contain sorted lists of integers/ Write a program to produce a third file DATA which holds a single sorted, merged list of these two lists. Use command line arguments to specify the file names.
void sort(FILE*, FILE*, FILE*);
main()
{
FILE *f1, *f2, *f;
int i;
f1=fopen("DATA1", "w"); //To set the sorted integers in file f1
for(i=0;i<=10; i=i+2)
putw(i, f1);
fclose(f1);
f2=fopen("DATA2", "w"); //To set the sorted integers in file f2
for(i=1;i<=11; i=i+2)
putw(i, f2);
fclose(f2);
printf("For first DATA:\n"); //To print the content of f1
f1=fopen("DATA1", "r");
while((i=getw(f1)) != EOF)
printf("%d, ", i);
fclose(f1);
printf("\nFor second DATA:\n"); //To print the content of file f2
f2=fopen("DATA2", "r");
while((i=getw(f2)) != EOF)
printf("%d, ", i);
fclose(f2);
sort(f1, f2, f); //To sort the integers from f1 and f2 and merge the sorted into file f
f=fopen("DATA", "r"); //To print the integers in file f
while((i=getw(f)) != EOF)
printf("%d, ", i);
fclose(f);
}
void sort(FILE *d1, FILE *d2, FILE *d)
{
int a, b;
d1=fopen("DATA1", "r");
d2=fopen("DATA2", "r");
d=fopen("DATA", "w");
a=getw(d1);
b=getw(d2);
for(;some condition;)
{
if(a>b)
{
int temp=a;
a=b;
b=temp;
b=getw(d2);
putw(a, d);
b=getw(d2);
}
else
{
putw(a, d);
a=getw(d1);
}
}
fclose(d1);
fclose(d2);
fclose(d);
}
现在程序在gcc编译器中使用命令"gcc file.c"编译。当我 运行 程序编译后,它显示文件 f1 的内容而不是文件 f2 的内容。我似乎陷入了循环,因为 Ctrl + D 不起作用。所以我必须终止程序。
输出为:
For first DATA:
0, 2, 4, 6, 8, 10,
For second DATA:
^Z
[6]+ Stopped ./a.out
现在这里有什么问题。我打印 f2 的整数的方式与打印 f1 的整数的方式相同,但为什么问题只出现在文件 f2 中?
您的代码应输出:
For first DATA:
0, 2, 4, 6, 8, 10,
For second DATA:
1, 3, 5, 7, 9, 11,
这就是您所需要的。我怀疑错误发生在不久之后,输出缓冲区没有及时刷新,因此数据保留在那里,没有显示在标准输出中(很可能是你的屏幕)。
将您的代码更改为:
printf("\nFor second DATA:\n"); //To print the content of file f2
f2=fopen("DATA2", "r");
while((i=getw(f2)) != EOF)
printf("%d, ", i);
fclose(f2);
printf ("\n");
fflush(stdout);
sort(f1, f2, f);
明白我的意思了。换行符刷新输出缓冲区本身,因此您可以使用任何一种方法。