Форум программистов, компьютерный форум CyberForum.ru

Создать очередь из файла, совершение операций надо очередью(удаление элемента, добавление, запись в файл, вывод) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
kirillyu
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 10
14.06.2013, 21:32     Создать очередь из файла, совершение операций надо очередью(удаление элемента, добавление, запись в файл, вывод) #1
Друзья, завтра сдать курсач, неделю парился с кодом. В итоге ничего дельного не вышло. Обращаюсь к вам, умельцы, за скорой помощью. Итак требуется: Создать очередь из файла, совершение операций надо очередью(удаление элемента, добавление, запись в файл, вывод). Проблема в том что почему то не выполняется dobase и я не знаю как выводить полученную очередь. На счет остального задания надеюсь и сам справлюсь но от помощи не откажусь. з.ы. Файл в конце.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
 
struct dan
{
  char nazv[15];
  char age2[15];
  char pol[15];
  char kurs[15];
  dan *next;
};
char getworld (FILE *vvod,char *kon,char word)
{
    int i=0;
    while (word!='~')
    {
        *(kon+i)=word;
        word=getc(vvod);
        i++;
    }
    return word;
}
 
void dobase (dan **top)
     {
            FILE *vvod;
            vvod=fopen("base.txt","r");
            dan *per, sled;
            char ch;
            ch=getc(vvod);
            sled=*((dan*)malloc(sizeof(dan)));
            per=(dan*)malloc(sizeof(dan));
            while (ch!=EOF)
            {
                strcpy(per->nazv,sled.nazv);
                strcpy(per->age2,sled.age2);
                strcpy(per->pol,sled.pol);
                strcpy(per->kurs,sled.kurs);
                per->next=(*top);
                (*top)=per;
            }
            puts("1");
            free(&sled);
            free(per);
     }
 
main()
{
    dan* top=NULL;
    top=(dan*)calloc(100,sizeof(dan));
    FILE *vvod;
    dobase(top);  //xz//xzxzxz
}
так же имеется вариант который пробовал осилить до этого но там полная неразбериха)
тут как я понимаю не правильно работает клинер добавив его выводит только первую строку файла.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
 
struct dan
{
  char nazv[15];
  char age[15];
  char sex[15];
  char kurs[15];
  dan *next;
};
 
char getword(FILE *vvod, char *konstop,char c)
{
int i=0;
char razdel;
char slovo;
while (razdel!='~');
{
    *(konstop+i)=slovo;
    slovo=c;
    c=getc(vvod);
    i++;
}
    return c;
}
 
void cleaner(char *elem,int n)
{
   int i;
    for(i=0;i<n;i++)
    {
        *(elem+i)=NULL;
    }
}
 
void cleanerall(dan *pal)
{
    cleaner(&pal->nazv[1],15);
    cleaner(&pal->age[1],15);
    cleaner(&pal->sex[1],15);
    cleaner(&pal->kurs[1],15);
}
 
dan* dobase(FILE *vvod)
{
    int k;
    k=0;
    char txt;
    dan *pred, *sled, *pt, temp;
    vvod=fopen("base.txt","r");
    txt=getc(vvod);
    while(txt!=EOF)
    {
        sled=(dan*)malloc(sizeof(dan));
        cleanerall(&temp);
        getword(vvod,&temp.nazv[1],txt);
        txt=getc(vvod);
        getword(vvod,&temp.age[1],txt);
        txt=getc(vvod);
        getword(vvod,&temp.sex[1],txt);
        txt=getc(vvod);
        getword(vvod,&temp.kurs[1],txt);
        txt=getc(vvod);
        k++;
         if (k!=1)
         {
             pred->next=sled;
         }
         else pt=sled;
        *sled=temp;
        pred=sled;
        txt=getc(vvod);
        if (txt==('\n')) txt=getc(vvod);
    }
    sled->next=NULL;
    return pt;
}
 
main()
{
 
    dan *pt,*tmp,*amp;
    FILE *vvod;
    tmp=dobase(vvod);
    puts("1")
    while (tmp->next!=NULL)
    {
            printf("%c",tmp->nazv[1]);
            printf("%c",tmp->age[1]);
            printf("%c",tmp->sex[1]);
            printf("%c",tmp->kurs[1]);
            tmp->next=NULL;
    }
 
 
}
заранее благодарен за ЛЮБУЮ оказанную помощь
Вложения
Тип файла: txt base.txt (122 байт, 6 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2013, 21:32     Создать очередь из файла, совершение операций надо очередью(удаление элемента, добавление, запись в файл, вывод)
Посмотрите здесь:

C++ Добавление и удаление элемента динамического массива
Бинарное дерево поиска (удаление, добавление элемента) C++
C++ Описать класс «множество» (добавление и удаление элемента, пересечение, объединение и удаление множеств )
Изменить удаление и добавление элементов в очередь по правилу FIFO. C++
C++ Одномерный динамический массив, передача в функции, добавление и удаление элемента
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2013, 21:02     Создать очередь из файла, совершение операций надо очередью(удаление элемента, добавление, запись в файл, вывод)
Еще ссылки по теме:

C++ Создать бинарный файл, внутри которого можно производить удаление и обновление инфомрации, а также добавление
Добавление и удаление элемента в списке C++
Сделать добавление элемента в массив и удаление элемента из массива используя STL C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kirillyu
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 10
18.06.2013, 21:02  [ТС]     Создать очередь из файла, совершение операций надо очередью(удаление элемента, добавление, запись в файл, вывод) #21
Цитата Сообщение от Olga_ Посмотреть сообщение
вот небольшие наброски по созданию очереди и вывода ее на экран

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1024
 
typedef struct STUDENT
{
  char name[30];
  char age[30];
  char sex[30];
  char kurs[30];
} STUDENT;
 
typedef struct ELT
{
  STUDENT student;
  struct ELT *next;
} ELT;
 
// чтение файла с базой данных
int ReadFile(char *fname)
{
   FILE *f;
   char s[1024], *t;
   if ((f = fopen(fname, "r")) == NULL)
      return 1;
   while (fgets(s, N, f) != NULL)
   {
      for(t = strtok(s, " ~\n\t"); t != NULL; t = strtok(NULL, " ~\n\t"))
         printf("%s  ", t);
      putchar('\n');
   }
   fclose(f);
   return 0;
}
 
/* добавление элемента в конец очереди */
void Add(ELT **first, ELT **last, STUDENT *student)
{
   ELT *q;
   q = (ELT *)malloc(sizeof(ELT));
   q->student = *student;
   q->next = NULL;
   if (*last == NULL)
      *first = q;
   else (*last)->next = q;
   *last = q;
}
 
// создание очереди
int CreateQueue(char *fname, ELT **first, ELT **last)
{
   FILE *f;
   char s[1024], *t;
   STUDENT student;
   if ((f = fopen(fname, "r")) == NULL)
      return 1;
   while (fgets(s, N, f) != NULL)
   {
      t = strtok(s, " ~\n\t"); strcpy(student.name, t);
      t = strtok(NULL, " ~\n\t"); strcpy(student.age, t);
      t = strtok(NULL, " ~\n\t"); strcpy(student.sex, t);
      t = strtok(NULL, " ~\n\t"); strcpy(student.kurs, t);
      Add(first, last, &student);
   }
   fclose(f);
   return 0;
}
 
// вывод элементов очереди на экран
void PrintQueue(ELT *first)
{
   ELT *q = first;
   while(q != NULL)
   {
       printf("%s %s %s %s\n", q->student.name, q->student.age, q->student.sex, q->student.kurs);
       q = q->next;
   }
}
 
int main()
{
   char fname[] = "base.txt";
   ELT *first = NULL, *last = NULL;
   //ReadFile(fname);
   CreateQueue(fname, &first, &last);
   PrintQueue(first);
   return 0;
}
Ольга, а можешь подробно объяснить на счет first и last - это предыдущий и следующий элемент? или начальный и конечный. Я хочу сделать сортировку, начать следует занести в ELT *chtoto first, потом занести в следующий элемент ->next; сравнить; и придется сразу вывести или как мне их заносить в очередь ведь ELT другая струтктура. и почему first и last с **? указатели на другую структуру с указателем на элемент очереди?

Добавлено через 5 минут
и еще допустим я их меняю местами, до какого момента это делать? Пример: очередь 2 5 1 3, беру первый и второй элемент сравнил, оставил как есть (по возрастанию) беду 2 и 3 поменял местами получил 2 1 5 3; буре 3 и 4 поменял местами получил 2 1 3 5 => сортировка не полная. какое условие сделать полной сортировки? или есть другой метод?

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void SortMass (ELT *abc, ELT **first, ELT **last)
{
    FILE *f;
    int k,j;
    char *srav1, *srav2;
    char s[1024], *t;
    STUDENT *stl,*stp,*sts;
    puts("Viberite pole:\n1 Po kursu\n2 Po vozrasu\n3 Po polu\n4 Po kursu");
    scanf("%d",&j);
    for (;;)
    {
        switch(j)
        {
            case 1: srav1=&stp->name[1]; srav2=&sts->name[1];
            case 2: srav1=&stp->age[1]; srav2=&sts->age[1];
            case 3: srav1=&stp->sex[1]; srav2=&sts->sex[1];
            case 4: srav1=&stp->kurs[1]; srav2=&sts->kurs[1];
        }
    printf("%c",srav1);
 
    puts("Viberite sortirovku:\n1 Po vozrastaniyu\n2 Po ybivaniyu");
    scanf("%d",&k);
    if k==1
    {
 
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Yandex
Объявления
18.06.2013, 21:02     Создать очередь из файла, совершение операций надо очередью(удаление элемента, добавление, запись в файл, вывод)
Ответ Создать тему
Опции темы

Текущее время: 05:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru