c - 如何将两个已排序的文件合并为一个已排序的文件?
问题描述
更具体地说,我想将两个排序的整数列表合并到第三个也排序的列表中。我不知道为什么我的代码不起作用!这是一些条目示例和我制作的代码:
文件1:
1
2
3
4
5
6
文件2:
7
8
9
9
9
10
C代码:
#include <stdio.h>
#include <stdlib.h>
void merge(char* arq1, char* arq2){
FILE* final;
final = fopen("merge.txt",'w');
FILE* f1 = fopen(arq1,'rt');
FILE* f2 = fopen(arq2,'rt');
if(!f1 || !f2) exit(1);
// n1 and n2 represents the actual value that's been read. r1 and r2 the status of each file.
int n1,n2,r1,r2,equal;
r1 = fscanf(f1,"%d",&n1);
r2 = fscanf(f2,"%d",&n2);
while(r1 || r2){
if((!r1) || (n2 < n1)){
fprintf(final,"%d ",n2);
r2 = fscanf(f2,"%d",&n2);
}else if((!r2) || (n1 < n2)){
fprintf(final,"%d ",n1);
r1 = fscanf(f1,"%d",&n1);
}else{
equal = n1;
fprintf(final,"%d ",equal);
while(n1 == equal) r1 = fscanf(f1,"%d",&n1);
while(n2 == equal) r2 = fscanf(f2,"%d",&n2);
}
}
fclose(final);
fclose(f1);
fclose(f2);
}
int main(int argc, char const *argv[]){
merge("merge1.txt","merge2.txt");
return 0;
}
该算法应该如下工作:
虽然至少其中一个文件仍有内容,但其内容随后将保存在该merge.txt
文件中。如果文件 1 和 2 具有相同的内容,我会保存内容并读取这 2 个文件,直到它们找到不同的值,这样合并的文件就不会有重复的值。
如何将两个已排序的文件合并为一个已排序的文件?
解决方案
的模式参数
fopen()
应该是一个字符串。fscanf()
可以在错误或 EOF 时返回 EOF(-1)失败时,目标变量的值
fscanf()
未定义。
#include <stdio.h>
#include <stdlib.h>
void merge(char* arq1, char* arq2){
FILE *final;
final = fopen("merge.txt", "w"); // <<--(1)
FILE *f1 = fopen(arq1, "rt"); // <<--(1)
FILE *f2 = fopen(arq2, "rt"); // <<--(1)
if(!f1 || !f2 || !final) exit(1); // <<--(1)
// n1 and n2 represents the actual value that's been read. r1 and r2 the status of each file.
int n1,n2,r1,r2,equal;
r1 = fscanf(f1, "%d", &n1);
r2 = fscanf(f2, "%d", &n2);
while(r1>0 || r2>0){ // <<--(2)
if(r1 < 1 || n2 < n1){ // <<--(2)
fprintf(final, "%d ", n2);
r2 = fscanf(f2, "%d", &n2);
}else if(r2 < 1 || n1 < n2){ // <<--(2)
fprintf(final, "%d ", n1);
r1 = fscanf(f1, "%d", &n1);
}else{
equal = n1;
fprintf(final, "%d ", equal);
while(n1 == equal && r1 > 0) r1 = fscanf(f1, "%d", &n1); // <<--(2,3)
while(n2 == equal && r2 > 0) r2 = fscanf(f2, "%d", &n2); // <<--(2,3)
}
}
fclose(final);
fclose(f1);
fclose(f2);
}
int main(int argc, char const *argv[]){
merge("merge1.txt","merge2.txt");
return 0;
}
推荐阅读
- python - 初读Python编程文:一个简单的游戏不断返回AttributeError
- azure - 用于移动应用的具有生物特征和证书的 Azure Active Directory
- visual-studio-code - 错误 E:无法统计 /var/lib/apt/lists/partial/packages.microsoft.com_repos_vscode_dists_stable_InRelease
- oracle - 在交互式报表中创建列链接 -Oracle Apex
- python - Django模型关系与循环关系
- android - 如何从片段内以编程方式在 TabLayout 中的选项卡之间切换
- php - 关于 amazon url , 什么意思 "i:aps","p_72","p_78","ssx:relevance"
- javascript - 是否可以同时使用外部 css 样式表/js 文件和外部 svg 文件?
- c# - 为什么 Control.Location 在 Windows 窗体中被限制为 Point(32767, 32767)
- sql - 如何将其标准化为 1NF?