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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2018, 09:20   #1
Max7557
Новичок
Джуниор
 
Регистрация: 02.01.2018
Сообщений: 1
Восклицание Помогите разобраться в чём проблема.

Я не знаю, с чем может быть связанна проблема, но программа либо жалуется на указатель к realloc, либо пишет "ошибка сегментирования". Помогите пожалуйста!

Запись пытался осуществить двумя способами. Один закомментирован.

Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "func.h"

void addfriend (int argc,char** argv,int ID)
{  
    FILE *bin;

    if (argv[1] != NULL)
    {
        bin = fopen (argv[1],"ab+");
    }
    else
    {
        bin = fopen ("default.bin","ab+");
    }
    
    int maxID = 0;
    
    fseek (bin,0,SEEK_SET);
    fread (&maxID,sizeof(int),1,bin);
    
    struct data user[maxID];
    
    int count;
    int own = 0;
    for (count = 1; count<=maxID; count++)
    {
       read_data (bin,&user[count]);
       if (user[count].identificator == ID)
       {
          own = count;
       }
    }
    fclose (bin);
    
    char login[30] = "\0";
    
    printf("\033[0d\033[2J");
    printf ("Введите логин пользователя, которого хотите добавить в друзья.\n");
    scanf ("%s",login);
    int loglen = strlen (login);
    login[loglen+1] = '\0';
    
    int crazy_mode = 0;
    int ident = 0;
    int cnt;
    int not_found = 1;
    int n = 0;
    
    for (cnt = 1; cnt<=maxID; cnt++)
    {
       if (comparison(login,user[cnt].login) == 0)
       {
          if (user[cnt].identificator == ID)
          {
             crazy_mode = 1;
             not_found = 0;
             break;
          }

          ident = user[cnt].identificator;

          if (user[own].num == 0)
          {
             user[own].num ++;
             n = user[own].num;
             user[own].list = (int*)malloc(n*sizeof(int));
             user[own].list[n-1] = ident;
          }
          else
          {
             user[own].num ++;
             n = user[own].num;
             user[own].list = realloc (user[own].list,n*sizeof(int));
             user[own].list[n-1] = ident;
          }
       
          not_found = 0;
          break;
       }
    }

    if (crazy_mode == 1)
    {
       printf ("Вы пытаетесь добавить себя. К сожалению, это невозможно.\n");
    }
    
    if (not_found == 1)
    {
       printf ("Этот пользователь не найден.\n");
    }
    
    if (crazy_mode == 0 && not_found == 0)
    {
       printf ("Вы успешно добавили этого пользователя.\n");
    }

    FILE *newbin;

    if (argv[1] != NULL)
    {
       newbin = fopen (argv[1],"wb+");
    }
    else
    {
       newbin = fopen ("default.bin","wb+");
    }
       
    fseek (newbin,0,SEEK_SET);
       
    fwrite (&maxID,sizeof(int),1,newbin);
    

       
    int i;
    for (i = 0; i<maxID; i++)
    {
          fwrite (&user[i].identificator,sizeof(int),1,newbin);
          fwrite (user[i].name,sizeof(char),30,newbin);
          fwrite (user[i].secname,sizeof(char),30,newbin);
          fwrite (user[i].ot,sizeof(char),30,newbin);
          fwrite (user[i].date,sizeof(char),10,newbin);
          fwrite (user[i].login,sizeof(char),30,newbin);
          fwrite (user[i].password,sizeof(char),30,newbin);
          fwrite (&user[i].rate,sizeof(int),1,newbin);
          fwrite (&user[i].num,sizeof(int),1,newbin); 
          fwrite (user[i].list,sizeof(int),user->num,newbin);
/*
       write_data (newbin,&user[i]);
*/
    }
     
    fclose (newbin);
      
    int z;
    for (z = 0; z<maxID; z++)
    {
       free_data (&user[z]);
    }

}
Чтение и запись осуществляются этими функциями.

Код:
void read_data (FILE *bin,struct data* user)
{
   fread (&user->identificator,sizeof(int),1,bin);
   fread (user->name,sizeof(char),30,bin);
   fread (user->secname,sizeof(char),30,bin);
   fread (user->ot,sizeof(char),30,bin);
   fread (user->date,sizeof(char),10,bin);
   fread (user->login,sizeof(char),30,bin);
   fread (user->password,sizeof(char),30,bin);
   fread (&user->rate,sizeof(int),1,bin);
   fread (&user->num,sizeof(int),1,bin);
   if (user->num == 0)
   {
      user->list = NULL;
   }
   else
   {
      user->list = (int*)malloc(user->num*sizeof(int));
      fread (user->list,sizeof(int),user->num,bin);  
   }
}

void write_data (FILE *bin,struct data* user)
{
   fwrite (&user->identificator,sizeof(int),1,bin);
   fwrite (user->name,sizeof(char),30,bin);
   fwrite (user->secname,sizeof(char),30,bin);
   fwrite (user->ot,sizeof(char),30,bin);
   fwrite (user->date,sizeof(char),10,bin);
   fwrite (user->login,sizeof(char),30,bin);
   fwrite (user->password,sizeof(char),30,bin);
   fwrite (&user->rate,sizeof(int),1,bin);
   fwrite (&user->num,sizeof(int),1,bin);     
   fwrite (user->list,sizeof(int),user->num,bin);
}
Сама структура.

Код:
struct data
{
   int identificator;
   char name[30];
   char secname[30];
   char ot[30];
   char date[10];
   char login[30];
   char password[30];
   int rate;
   int num;
   int *list;
};
Max7557 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с размером шрифта. Помогите разобраться mrcojuhari HTML и CSS 1 06.04.2017 13:25
Перебор всех значений связанного графа. Помогите разобраться в чём проблема... StarterX Общие вопросы C/C++ 0 11.01.2016 19:42
Помогите кое в чём разобраться ??? Programmer №1 Свободное общение 2 09.06.2014 10:31
Пожалуйста, помогите разобраться, в чём ошибки.(Рекурсии. Паскаль) katris Помощь студентам 3 21.12.2009 12:28