Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2013, 08:47   #1
prem1era
Пользователь
 
Аватар для prem1era
 
Регистрация: 16.11.2009
Сообщений: 33
По умолчанию Найти ошибку

Задание такое : Даны два двоичных файла, содержащих целые числа. Вывести на экран только те значения, которые присутствуют и в первом и во втором файлах. При этом каждое число должно быть выведено только один раз.
вот код
Код:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define bsize 4096

void work(FILE *in1, FILE *in2, FILE *outt)
{
    size_t count1,coutt2;//кол-во считанных записей
    int i,j,found;// i,j -счетчики  found-проверка на найденное в блоке число
    int buff1[bsize],buff2[bsize];//буферы под числа
    fseek(in1,0,SEEK_SET);//в начало 1-ого файла
    do
    {
        count1=fread(buff1,sizeof(int),bsize,in1);//считаваем блок в первый буфер
        for(i=0;i<count1;++i)//проходим по первому буферу
        {
            fseek(in2,0,SEEK_SET);//на начало второго файла
            found=0;
            do
            {
                coutt2=fread(buff2,sizeof(int),bsize,in2);//считаем блок из второго файла
                for(j=0;j<coutt2;++j)//ищем во втором блоке тукущие число из первого
                {
                    if(buff1[i]==buff2[j])//равны
                    {
                       found=1;
                       fwrite(&buff1[i],sizeof(int),1,outt);
                      // fread(&buff1[i],sizeof(int),1,outt);
                      // fprintf(outt,"\n Otvet   %d\n",buff1[i]);
                       break;
                    }

                }
            }
            while((found==0)&&(count1==bsize));//пока не найдено и не конец второго файла
        }
    }
    while(count1==bsize);//пока не конец первого файла
}
int vvod(FILE *f,char filename[80])//Создания двоичного файла и щапись в него целых чисел
{
    int a,n;
    if((f=fopen(filename,"w"))==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");
    while(n-->0)
    {
                scanf("%d",&a);
                if(fwrite(&a,sizeof(int),1,f)!=1)
                {
                                                 perror(filename);
                                                 return 1;
                }
    }
    fclose(f);
    return 0;
}
int viit(FILE *f,char filename[80])//вывод на экран содердимого двоичного файла
{
    int a;
    puts("Imay fila:");
    printf("%c\n",filename);
    if((f=fopen(filename,"rb"))==NULL)
    {
                                     perror(filename);
                                     return 1;
    }
    while(fread(&a,sizeof(int),1,f)==1)
    printf("%s\n",a);
    if(feof(f))
    return 0;
    else
    {
        perror(filename);
        return 0;
        }
        }
int main()
{
FILE *f,*q,*outt;
int a,n=0;
char filename[MAX],filename1[MAX],filename2[MAX];
puts("Vvedite imay pervogo faila");
scanf("%s",filename);
vvod(f,filename);
puts("Vvedite imay vtorogo faila");
scanf("%s",filename1);
vvod(q,filename1);
if((f=fopen(filename,"rb"))==NULL)
{
                                perror(filename);
                                return 1;
}
if((q=fopen(filename1,"rb"))==NULL)
{
                                   perror(filename1);
                                   return 1;
}
puts("Vvedite imay vivod faila");
scanf("%s",filename2);
outt=fopen(filename2,"wb");
work(f,q,outt);
fclose(f);
fclose(q);
fclose(outt);
viit(outt,filename2);
fclose(outt);
return 0;
}
В конце программы всегда выдает Ошибку сегментации, работает через раз может выдать правильный ответ и в конце написать ошибка сегментации а может просто написать ошибка сегментации.
prem1era вне форума Ответить с цитированием
Старый 11.12.2013, 11:54   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Что отладчик говорит?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 11.12.2013, 14:28   #3
prem1era
Пользователь
 
Аватар для prem1era
 
Регистрация: 16.11.2009
Сообщений: 33
По умолчанию

Да ничего не говорит. Чаще всего эта ошибка выскакивает когда компилирую на Unix через cc
prem1era вне форума Ответить с цитированием
Старый 11.12.2013, 17:19   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В таких случаях я обычно поступаю так:
1) Пишу процедуру, которая записывает строку в некий файл. Разтыкиваю эту процедуру по всему коду, а в ее параметр передаю имя очередного выполненного оператора (операции). Так если происходит падение я открываю файл, и вижу какая из операций последней выполнилась успешно.
2) Коментирую код. Запускаю - если отработал - раскоментирую по одному оператору и опять запускаю. И так пока не проявится падение.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.12.2013, 21:25   #5
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Почему файл для чтения открывается в "rb", а для записи в "w"? Почему числа печатаются с %s, а строки с %c?
Son Of Pain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти ошибку в коде (Для данной целочисленной матрицы размером n*m найти матрицу из 0 и 1...) код на C camel5 Помощь студентам 1 26.11.2013 06:11
найти ошибку! огр Помощь студентам 2 04.06.2013 10:24
Найти ошибку Lenty Общие вопросы C/C++ 7 15.06.2012 09:44
найти ошибку IceFlame1292 Помощь студентам 4 11.01.2011 20:14
найти ошибку Veronik@ Общие вопросы C/C++ 0 24.11.2010 21:50