• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Создание Структуры - Телефонная Книжка

  • Автор темы Avanbars
  • Дата начала
A

Avanbars

Структура имеет вид: фамилия, номер телефона, дата рождения. Внести в начало списка информацию о четырех новых знакомых.

C++:
#include <stdio.h>
#include <conio.h>
#include <string.h>

struct spisok
{
char familiya[10];
char nomer[10];
char data[10];
} a;

void input (FILE*);
void print (FILE*);
void app (FILE*);

int main ()
{
char b;
FILE*c;
while (1)
{
puts ("1-new file");
puts ("2-view file");
puts ("3-add from file");
puts ("0-exit");
b=getch ();
switch (b)
{
case '1': input (c); break;
case '2': print (c); break;
case '3': app (c); break;
case '0': return 0;
default: puts ("bad rejim");
}
}
return 0;
}

void input (FILE*c)
{
char ch;
c=fopen ("telbaza.dat","wb");
printf ("\nEnter the information on the acquaintance\n");
do
{
printf ("\nfamiliya:"); scanf ("%s",&a.familiya);
printf ("nomer telefona:"); scanf ("%s",&a.nomer);
printf ("date of birth:"); scanf ("%s",&a.data);
fwrite (&a,sizeof (a),1,c);
printf ("\nfinish? y/n");
ch=getch ();
} while (ch!='y');
fclose (c);
}
//-------------------
void print (FILE*c)
{
int i;
c=fopen ("telbaza.dat","rb");
i=1;
fread (&a,sizeof (a),1,c);
while (!feof (c))
{
printf ("\n%s\nnomer telefona: %s\ndate of birth: %s",a.familiya,a.nomer,a.data);
fread (&a,sizeof (a),1,c);
i++;
}
getch ();
}

//------------
void app (FILE*c)
{
char ch;
int i,k;
spisok mas[10],tmp;
c=fopen ("telbaza.dat","rb+");
k = 0;
while(!feof(c))
fread(&mas[k++],sizeof(a),1,c);

rewind (c);
printf ("\nTo add the information\n");
do
{
printf ("\nfamiliya:"); scanf ("%s", &tmp.familiya);
printf ("nomer telefona:"); scanf ("%s",&tmp.nomer);
printf ("date of birth:"); scanf ("%s", &tmp.data);
fwrite (&tmp,sizeof (tmp),1,c);

printf ("\nfinish? y/n");
ch=getch ();
} while (ch!='y');

for(i=0;i<k;i++)
fwrite(&mas[i],sizeof(a),1,c);

fclose(c);
}

как с помощью функции void app добавить данные не в конец списка, а в начало списка?
 
W

Whatka

r04 тут массив структур с именем список)(вернее spisok)

обращение по индексам же
если хотите не потерять уже введённые данные,- надо перезаписывать со смещением
 
R

rrrFer

Whatka
там вроде бы все содержимое файла считывается
, затем каретка в файле смещается на начало
, затем в файл помещаются новые, введенные юзером данные,
, затем в файл помещаются данные, считанные из файла на первом шаге.

Т.е. новые данные добавляются в начало файла, разве нет?

надо перезаписывать со смещением
это как?
 
W

Whatka

[1][2][3][*][*]
+9,10
[1][2][1][2][3]
[9][10][1][2][3]
что я имел в виду под смещением

я вообще как-то проглядел эту функцию)
тогда по другому надо)
 
A

Avanbars

Whatka
там вроде бы все содержимое файла считывается
, затем каретка в файле смещается на начало
, затем в файл помещаются новые, введенные юзером данные,
, затем в файл помещаются данные, считанные из файла на первом шаге.

Т.е. новые данные добавляются в начало файла, разве нет?

нет, новые данные добавляются в конец списка, а по заданию нужно чтобы добавлялись в начало :mellow:

Добавлено: <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Вот решение этой задачи, правда есть один косяк - после добавления нового контакта в начало списка при просмотре появляется лишняя строка в конце списка:</div></div><div class="sp-body"><div class="sp-content">#include <stdio.h>
#include <conio.h>
#include <string.h>

struct spisok
{
char familiya[10];
char nomer[10];
char data[10];
} a;

void input (FILE*);
void print (FILE*);
void app (FILE*);

int main ()
{
char b;
FILE*c;
while (1)
{
puts ("1-new file");
puts ("2-view file");
puts ("3-add from file");
puts ("0-exit");
b=getch ();
switch (B)
{
case '1': input ©; break;
case '2': print ©; break;
case '3': app ©; break;
case '0': return 0;
default: puts ("bad rejim");
}
}
return 0;
}

void input (FILE*c)
{
char ch;
c=fopen ("telbaza.dat","wb");
printf ("\nEnter the information on the acquaintance\n");
do
{
printf ("\nfamiliya:"); scanf ("%s",&a.familiya);
printf ("nomer telefona:"); scanf ("%s",&a.nomer);
printf ("date of birth:"); scanf ("%s",&a.data);
fwrite (&a,sizeof (a),1,c);
printf ("\nfinish? y/n");
ch=getch ();
} while (ch!='y');
fclose ©;
}
//-------------------
void print (FILE*c)
{
int i;
c=fopen ("telbaza.dat","rb");
i=1;
fread (&a,sizeof (a),1,c);
while (!feof ©)
{
printf ("\n%s\nnomer telefona: %s\ndate of birth: %s",a.familiya,a.nomer,a.data);
fread (&a,sizeof (a),1,c);
i++;
}
getch ();
}

//------------
void app (FILE*c)
{
char ch;
int i,k;
spisok mas[10],tmp;
c=fopen ("telbaza.dat","rb+");
k = 0;
while(!feof©)
fread(&mas[k++],sizeof(a),1,c);

rewind ©;
printf ("\nTo add the information\n");
do
{
printf ("\nfamiliya:"); scanf ("%s", &tmp.familiya);
printf ("nomer telefona:"); scanf ("%s",&tmp.nomer);
printf ("date of birth:"); scanf ("%s", &tmp.data);
fwrite (&tmp,sizeof (tmp),1,c);

printf ("\nfinish? y/n");
ch=getch ();
} while (ch!='y');

for(i=0;i<k;i++)
fwrite(&mas,sizeof(a),1,c);

fclose©;
}

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">косяк(лишняя строка появляется каждый раз при добавлении нового контакта, т.е. сколько новых контактов добавим в начало списка, столько же и получим лишних строк</div></div><div class="sp-body"><div class="sp-content">

 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!