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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2013, 13:56   #1
Avanbars
 
Регистрация: 03.01.2013
Сообщений: 8
По умолчанию Создать структуру - телефонная база на языка си

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

Код:
#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 добавить данные не в конец списка, а в начало списка?

Последний раз редактировалось Stilet; 03.01.2013 в 22:17.
Avanbars вне форума Ответить с цитированием
Старый 03.01.2013, 22:34   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Как пример:
Код:
void app(FILE* f,char *fio,int age){
	fseek(f,0,SEEK_END);
	int i=ftell(f);
	char* c=(char*)malloc(i);
	fseek(f,0,SEEK_SET);
	fread(c,i,1,f);
	fseek(f,0,SEEK_SET);
	char* s=(char*)malloc(255);
	sprintf(s,"%s\n%d",fio,age);
	fwrite(s,255,1,f);
	fwrite(c,i,1,f);
	free(s);free(c);
}
подходит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.01.2013, 08:38   #3
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

просто так не выйдет.... файл это поток, при fwrite и всех его использующих фун, просто затерают содержимое. Способ только один, затолкать всё в память, установить поток на начало припомощи fseek вписать инфу и записать всё из памяти. удаление столько же гемора.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 04.01.2013, 20:48   #4
Avanbars
 
Регистрация: 03.01.2013
Сообщений: 8
По умолчанию

Вот еще решение этой задачи, правда есть один косяк - после добавления нового контакта в начало списка при просмотре появляется лишняя строка в конце списка:

Код:
#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 ();
{
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[i],sizeof(a),1,c);

fclose©;
}
вот косяк(лишняя строка появляется каждый раз при добавлении нового контакта, т.е. сколько новых контактов добавим в начало списка, столько же и получим лишних строк)


Avanbars вне форума Ответить с цитированием
Старый 04.01.2013, 22:08   #5
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Код:
for(i=0;i<k-1;i++)
fwrite(&mas[i],sizeof(a),1,c);
Если так?
/-----
скорее k уже больше на одну единицу. из за инкрементов.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 05.01.2013, 12:51   #6
Avanbars
 
Регистрация: 03.01.2013
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Код:
for(i=0;i<k-1;i++)
fwrite(&mas[i],sizeof(a),1,c);
Если так?
/-----
скорее k уже больше на одну единицу. из за инкрементов.
спасибо большое, теперь все работает нормально
Avanbars вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать структуру Cathrin C# (си шарп) 3 05.11.2011 20:23
создать БД "комерческая телефонная компания" AlewkaS Фриланс 5 19.04.2011 21:53
создать БД "комерческая телефонная компания" AlewkaS Microsoft Office Access 1 19.04.2011 07:46
TCategoryButtons создать структуру ? Родион Компоненты Delphi 2 07.05.2008 16:41