Задать вопрос
caramel14
@caramel14
Всякое разное этакое чажу

Функция gets в языке С. Почему посимвольное сравнение не работает?

На этапе посимвольного сравнения программа выдаёт ошибку. Что делать?

#include <stdio.h>
#include <stdbool.h>

int main() {

    char sim1, sim2, n;
    bool ni = false;
//открываем текстовые файлы//
    FILE *txt1;
    txt1=fopen("txt.txt","r");
    FILE *txt2;
    txt2=fopen("txt2.txt","r");
    FILE *txt3;
    txt3=fopen("txt3.txt","w");
//тестим на предмет их наличия//
    if (!txt1 || !txt2 == NULL) {
        printf (  "I can't open a file for reading \n" );

        return 1;
    }

    if(!txt3==NULL) {
        printf( "I can't open a file for writing \n");

        return 1;
    }

    printf ( "txt1 and txt2 files are open \n");

    // посимвольно сравниваем txt1 и txt2//
    while(txt1 && txt2) {

        txt1=fgets(sim1);
        txt2=fgets(sim2);

        if(sim1 == sim2)
            fputc(sim1,txt3);
        else
            ni = true;
    }

    if(ni==false) {
        // сообщение о успехе
        printf (  "The file contents are identical \n" );
    } else {
        // Если посимвольное сравнение не увенчалось успехом
        printf (  "The contents of the files are not identical \n" );
    }

    // закрываем файлы
    fclose(txt1);
    fclose(txt2);
    fclose(txt3);

    printf ( "End of program" );

    return 0;
}
  • Вопрос задан
  • 233 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
shurshur
@shurshur
Сисадмин, просто сисадмин...
Что тут вообще написано?

Сначала txt1 - это FILE*. Потом зачем-то txt1=fgets(sim1), то есть в переменную типа FILE* присваивается что? Советую посмотреть описание fgets в документации:

char *fgets(char *s, int size, FILE *stream);

Присваивается char*. А откуда, из какого файла?

Думаю, имелось в виду:

sim1=fgetc(txt1);

Тогда это имеет какой-то смысл.

Далее, while по txt1 && txt2 не имеет смысла - указатели будут ненулевыми даже когда будет достигнут конец файлов. Правильнее обернуть в такой цикл:

while(!feof(txt1) && !feof(txt2)) { ... }

В конце проверить, что feof(txt1) && feof(txt2), иначе один из файлов закончился, а второй нет - размеры не совпадают, файлы отличаются.

А более правильно делать блочное чтение, с помощью fread и memcmp, это гораздо эффективнее по скорости (да, конечно, для мелких файлов разница незаметна, но всё же):

int isequal=1;
while(!feof(txt1) && !feof(txt2)) {
  char buf1[1024];
  char buf2[1024];
  int readsize1 = fread(buf1, 1, 1024, txt1);
  int readsize2 = fread(buf2, 1, 1024, txt2);
  if (readsize1 != readsize2) {
    isequal=0;
    break;
  } else {
    if (memcmp(buf1, buf2, readsize1)) {
      isequal=0;
      break;
  }
}

if(isequal) {
  // одинаковы
} else {
  // отличаются
}
Ответ написан
#include <stdio.h>
#include <stdbool.h>

int main() {

    char sim1, sim2;
    bool ni = false;

    //открываем текстовые файлы//
    FILE *txt1 = fopen("txt1.txt", "rb");
    FILE *txt2 = fopen("txt2.txt", "rb");
    FILE *txt3 = fopen("txt3.txt", "wb");

    //тестим на предмет их наличия//
    if (txt1 == NULL || txt2 == NULL) {
        printf (  "I can't open a file for reading \n" );

        return 1;
    }

    if(txt3 == NULL) {
        printf( "I can't open a file for writing \n");

        return 1;
    }

    printf( "txt1 and txt2 files are open \n");

    // посимвольно сравниваем txt1 и txt2//
    while(!feof(txt1) && !feof(txt2)) {

        sim1 = fgetc(txt1);
        sim2 = fgetc(txt2);

        if(sim1 == sim2 && !feof(txt1) && !feof(txt2))
            fputc(sim1, txt3);
        else if(sim1 != sim2 || !feof(txt1) || !feof(txt2))
            ni = true;
    }

    if(!ni && feof(txt1) && feof(txt2)) {
        // сообщение о успехе
        printf ("The file contents are identical \n" );
    } else {
        // Если посимвольное сравнение не увенчалось успехом
        printf ("The contents of the files are not identical \n" );
    }

    // закрываем файлы
    fclose(txt1);
    fclose(txt2);
    fclose(txt3);

    printf ( "End of program" );

    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы