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

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

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

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

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

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

Даны два двоичных файла, содержащих целые числа. Вывести на экран только те значения, которые присутствуют и в первом и во втором файлах. При этом каждое число должно быть выведено только один раз.

Вот мой код. Постоянно выдает ошибка сегментации или просто зависает при выполнении.
Код:
#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;
}
prem1era вне форума Ответить с цитированием
Старый 05.12.2013, 13:13   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Код:
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);
}
Во-первых, объявляется указатель FILE *w;, но нигде не инициализируется и файл не открывается
Во-вторых, логика этой функции должна быть такая:
1. Читаются в два буфера содержимое исходных файлов,
2. создается третий буфер
3. последовательно сравнивается каждое число из буфера одного файла со всеми числами другого, если найдено совпадение, то сохранять его в результирующий буфер.
4. такая же история со вторым буфером файла.
5. очистить результирующий буфер от повторений
6. возвратить из функции буфер-результат

// алгоритм работать будет, но оставляет большой простор для оптимизации )
Smogg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си. Работа с файлами Mary_07 Помощь студентам 1 29.12.2011 19:56
Работа с файлами на С++ nec117 Общие вопросы C/C++ 4 24.02.2009 23:18
работа с файлами в с++ kermit Помощь студентам 13 09.06.2008 02:21
Работа с файлами Maksi Фриланс 4 07.06.2008 11:38