Вывести на экран значения, которые присутствуют и в первом и во втором файлах - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д