Вывести на экран значения, которые присутствуют и в первом и во втором файлах - 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;
}