Новичок
Джуниор
Регистрация: 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;
};
|