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

Тема в разделе "C/C++/C#", создана пользователем Avanbars, 3 янв 2013.

  1. Avanbars

    Avanbars New Member

    Регистрация:
    3 янв 2013
    Сообщения:
    2
    Симпатии:
    0
    Структура имеет вид: фамилия, номер телефона, дата рождения. Внести в начало списка информацию о четырех новых знакомых.

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    тут вообще нет списка

    Добавлено: app вроде бы должен добавлять записи в начало файла
     
  3. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    r04 тут массив структур с именем список)(вернее spisok)

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Whatka
    там вроде бы все содержимое файла считывается
    , затем каретка в файле смещается на начало
    , затем в файл помещаются новые, введенные юзером данные,
    , затем в файл помещаются данные, считанные из файла на первом шаге.

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

    это как?
     
  5. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    [1][2][3][*][*]
    +9,10
    [1][2][1][2][3]
    [9][10][1][2][3]
    что я имел в виду под смещением

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

    Avanbars New Member

    Регистрация:
    3 янв 2013
    Сообщения:
    2
    Симпатии:
    0
    нет, новые данные добавляются в конец списка, а по заданию нужно чтобы добавлялись в начало :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">
    [​IMG]
    [​IMG]
     
Загрузка...

Поделиться этой страницей