Как объединить два отсортированных файла в один отсортированный файл? - PullRequest
1 голос
/ 06 октября 2019

Более конкретно, я хочу объединить два отсортированных списка целых чисел в третий список, который также отсортирован. Я не могу понять, почему мой код не работает! Вот некоторые примеры записей и код, который я сделал:

Файл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 файла читать, пока они не найдут другое значение, чтобы объединенный файл не имел повторяющихся значений.

Как объединитьдва отсортированных файла в один отсортированный файл?

Ответы [ 2 ]

2 голосов
/ 06 октября 2019
  1. аргументом режима для fopen() должна быть строка.

  2. fscanf() может возвращать EOF (-1) при ошибке или EOF

  3. При сбое значение целевой переменной (переменных) для 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;
}
0 голосов
/ 06 октября 2019

отправленный код OPs не может быть скомпилирован!

Вот вывод от компилятора:

gcc    -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11  -c "untitled.c"  

untitled.c: In function ‘merge’:
untitled.c:6:31: warning: passing argument 2 of ‘fopen’ makes pointer from integer without a cast [-Wint-conversion]
     final = fopen("merge.txt",'w');
                               ^~~

In file included from untitled.c:1:0:
/usr/include/stdio.h:232:14: note: expected ‘const char * restrict’ but argument is of type ‘int’
 extern FILE *fopen (const char *__restrict __filename,
              ^~~~~

untitled.c:7:27: warning: multi-character character constant [-Wmultichar]
     FILE* f1 = fopen(arq1,'rt');
                           ^~~~

untitled.c:7:27: warning: passing argument 2 of ‘fopen’ makes pointer from integer without a cast [-Wint-conversion]

In file included from untitled.c:1:0:
/usr/include/stdio.h:232:14: note: expected ‘const char * restrict’ but argument is of type ‘int’
 extern FILE *fopen (const char *__restrict __filename,
              ^~~~~

untitled.c:8:27: warning: multi-character character constant [-Wmultichar]
     FILE* f2 = fopen(arq2,'rt');
                           ^~~~

untitled.c:8:27: warning: passing argument 2 of ‘fopen’ makes pointer from integer without a cast [-Wint-conversion]

In file included from untitled.c:1:0:
/usr/include/stdio.h:232:14: note: expected ‘const char * restrict’ but argument is of type ‘int’
 extern FILE *fopen (const char *__restrict __filename,
              ^~~~~

untitled.c: In function ‘main’:
untitled.c:33:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
 int main(int argc, char const *argv[]){
              ^~~~

untitled.c:33:32: warning: unused parameter ‘argv’ [-Wunused-parameter]
 int main(int argc, char const *argv[]){
                                ^~~~

относительно:

final = fopen("merge.txt",'w');

'mode'Параметр должен быть строкой. Рекомендуется использовать двойные кавычки вокруг параметра 'mode':

final = fopen("merge.txt","w");

относительно:

FILE* f1 = fopen(arq1,'rt');

, как и раньше, параметр 'mode' должен быть строкой. Предложите:

FILE* f1 = fopen(arq1,"rt");

для функции main(), поскольку параметры не используются, предложите использовать сигнатуру:

int main( void )

При компиляции всегда включайте предупреждения, затем исправьтеэти предупреждения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...