Вывести на экран значения, которые присутствуют и в первом и во втором файлах - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Даны два двоичных файла, содержащих целые числа. Вывести на экран только те значения, которые присутствуют и в первом и во втором файлах. При этом каждое число должно быть выведено только один раз. Вот мой код. Постоянно выдает ошибка сегментации или просто зависает при выполнении.
#include <stdio.h>
#include <windows.h>
#include <locale.h>
#define MAX 100
int work(FILE *f,FILE *q)
{
int a,aa;
FILE *w;
while((fread(&a,sizeof(int),1,f)==1)||(fread(&aa,sizeof(int),1,q)==1))
{
        if(a==aa)
                {
                        if(fwrite(&a,sizeof(int),1,w)==1)
                        return 1;
                }
}
return !feof(w);
}
int main()
{
setlocale(LC_ALL, "Russian");
FILE *f,*q;
int a,n;
char filename[MAX],filename1[MAX];
puts("Введите Vvedite imay pervogo faila");
scanf("%s",filename);
if((f=fopen(filename,"wb"))==NULL)
{
        perror(filename);
        return 1;
}
do
{
        printf("Vvedite kol-vo elementov ot 0 do %d\n",MAX);
        scanf("%d",&n);
}
while(n<0||n>MAX);
puts("Vvedite elementy\n");
while(n-->0)
{
        scanf("%d",&a);
        if(fwrite(&a,sizeof(int),1,f)!=1)
        {
                perror(filename);
                return 1;
        }
        fclose(f);
    }
puts("Vvedite imay vtorogo faila");
scanf("%s",filename);
if((q=fopen(filename,"wb"))==NULL)
{
        perror(filename);
        return 1;
}
do
{
        printf("Vvedite kol-vo elementov ot 0 do %d\n",MAX);
        scanf("%d",&n);
}
while(n<0||n>MAX);
puts("Vvedite elementy\n");
while(n-->0)
{
        scanf("%d",&a);
        if(fwrite(&a,sizeof(int),1,q)!=1)
        {
                perror(filename);
                return 1;
        }
        fclose(q);
        }
if((f=fopen(filename,"rb"))==NULL)
{
                                perror(filename);
                                return 1;
}
if((q=fopen(filename1,"rb"))==NULL)
{
                                   perror(filename1);
                                   fclose(q);
                                   return 1;
}
a=work(f,q);
return a;
}

Решение задачи: «Вывести на экран значения, которые присутствуют и в первом и во втором файлах»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
// размер блока в кол-ве чисел
#define bsize 4096
 
void work(FILE* in1, FILE* in2, FILE* out) {
    size_t count1, count2; // кол-во считаных записей
    int i,j,  // счетчики
        found;// если в текущем блоке найдено число, то 1, иначе 0
    int buff1[bsize], buff2[bsize]; // буферы под числа
    
    // установка в начало 1-го файла
    fseek(in1, 0, SEEK_SET);
    do {
        // считать блок в 1й буфер
        count1 = fread(buff1, sizeof(int), bsize, in1);
        // проходимся по 1му блоку
        for(i=0; i<count1; ++i) {
            // сбросить курсор 2го файла в начало
            fseek(in2, 0, SEEK_SET);
            found = 0;
            do {
                // считать блок из 2го файла
                count2 = fread(buff2, sizeof(int), bsize, in2);
                // ищем во втором блоке текущее чесло из первого
                for(j=0; j<count2; ++j) {
                    if(buff1[i] == buff2[j]) { // нашли
                        found = 1;
                        fprintf(out, "%d\n", buff1[i]);
                        break;
                    }
                }
            }
            // пока не найдено и не конец 2го файла
            while((found==0)&&(count1 == bsize));
        }
    }
    // пока не конец 1го файла
    while(count1 == bsize);
}
 
int main() {
    FILE *f1, *f2;
    f1 = fopen("f.1", "rb");
    f2 = fopen("f.2", "rb");
    work(f1, f2, stdout);
    fclose(f2);
    fclose(f1);
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы