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

Работа со структурами - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 44, средняя оценка - 4.68
cx5xclxxl9
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 21:00     Работа со структурами #1
Имеется вот такая задача:

Файл, содержащий даты. Каждая дата - это структура,
помещенная в отдельную запись. Состав структуры:

struct date{
short число;
char месяц[15];
short год;
struct{
short часы;
short минуты;
};
}

Составить программу, создающую такой файл.
Составить программу, которая:
* выводит на экран все даты, попадающие в указанный с клавиатуры
интервал (если время не задано, то оно игнорируется);
* выводит самую раннюю дату


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

Добавлено через 16 минут
Помогите, пожалуйста, очень срочно нужно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2011, 21:00     Работа со структурами
Посмотрите здесь:

C++ Работа со структурами
C++ работа со структурами
Работа со структурами C++
Работа со структурами C++
C++ Работа со структурами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
marina2
Рожденная для битвы
 Аватар для marina2
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
07.06.2011, 21:05     Работа со структурами #2
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
Я не могу понять, как создать неограниченное количество этих структур
Можно например сделать массив или список структур Умеешь такое? На форуме много таких тем

А потом путем доступа к элементам списка и доступа элементам структуры сравнивать нужные параметры
cx5xclxxl9
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 21:15  [ТС]     Работа со структурами #3
Ты имеешь ввиду вот такой массив структур?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct key {
    char *word;
    int count;
} keytab[] = {
    "auto", 0,
    "break", 0,
    "case", 0,
    "char", 0,
    "const", 0,
    "continue", 0,
    "default", 0,
    /*...*/
    "unsigned", 0,
    "void", 0,
    "volatile", 0,
    "while", 0
};
marina2
Рожденная для битвы
 Аватар для marina2
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
07.06.2011, 21:52     Работа со структурами #4
С массивами я не работала, так что точно не могу сказать

Попробуй так (это список)

C++
1
2
3
4
5
struct list{
stract data
{.....}
list *next; //указатель на следующий элемент списка
}
cx5xclxxl9
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 21:56  [ТС]     Работа со структурами #5
Цитата Сообщение от marina2 Посмотреть сообщение
{.....}
А в это место что нужно вставлять?
marina2
Рожденная для битвы
 Аватар для marina2
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
07.06.2011, 22:03     Работа со структурами #6
http://www.cyberforum.ru/cpp-beginne...ead312778.html
Посмотри это, может получится?

Добавлено через 4 минуты
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
А в это место что нужно вставлять?
Так это же твоя структура)

Ты понял насчет массива, как его создавать?
cx5xclxxl9
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 22:26  [ТС]     Работа со структурами #7
Ага, сейчас попробую написать
marina2
Рожденная для битвы
 Аватар для marina2
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
07.06.2011, 23:02     Работа со структурами #8
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
#include <stdio.h>
#include <conio.h>  //ne rabotaet clrscr
#include <iostream>
using namespace std;
 
void function1();
struct date{
int ch;
char m[15];
int y;
struct time{
int cl;
int min;} t;
};
 
void main (void)
{
int menu=0;
 
        vozvrat:
        while (menu!=6)
        {
        printf("_____________________________________________________________\n");
        printf("____________________Abonenti ATS_____________________________\n");
        printf("_____________________________________________________________\n");
        printf("Vibirite odin iz variantov:\n");
        printf("1 - Zagruzit' mnogestvo iz tekstovogo faila(ini)\n");
        printf("2 - Prosmotr vsex elementov massiva\n");
        printf("3 - Dobavlenie novix elementov v konec massiva iz zad. faila\n");
        printf("4 - Udalenie elementov massiva\n");
        printf("5 - Sohranenie massiva v zadannom formate\n");
        printf("6 - Vixod iz programmi\n");
        printf("-------------------------------------------------------------\n");
        scanf("%d", &menu);
 
        switch (menu){
                case 1: goto menu1;
 
                }
        menu1:
                {
                // function1(); //Obyavlenie funkcii
                function1();            //vizov funkcii
                }
                goto vozvrat;
                }
//return 0; /*pokazivaet chto programma uspesno zavershena*/
}
 
 
//////////*opisanie funkcii zagruzki massiva*/
void function1()
{
FILE *f1;    /*sozdaem ukazatel na peremennyu tipa fail*/
 
 date mas_str[20];
int i,n;
 
 
cout<<("kol-vo elem");
cin>>n;
for (i=0;i<n;i++)
        {
        cout<<"chislo";
        cin>>mas_str[i].ch;
                cout<<"/nMesyac:";
                cin>>mas_str[i].m;
                cout<<"/nGod:";
                cin>>mas_str[i].y;
                cout<<"/nChas:";
                cin>>mas_str[i].t.cl;
                cout<<"/nCMinut:";
                cin>>mas_str[i].t.min;
 
      
 }
}
Добавлено через 1 минуту
Что-то наподобие такого должно получится
cx5xclxxl9
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 23:09  [ТС]     Работа со структурами #9
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
// 4.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <stdio.h>
#include <windows.h>
#include <conio.h>
using namespace std;
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
#define N 20
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              };
 
           };
 
    struct date mas_date[N];
    struct date.vremya mas_time[N];
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("Введите число: ");
        scanf("%d",mas_date[i].chislo);
        cyrOut("Введите месяц (например: Февраль) : ");
        scanf("%c",mas_date[i].mes);
        cyrOut("Введите год: ");
        scanf("%d",mas_date[i].god);
        cyrOut("Введите время (часы): ");
        scanf("%d",mas_time[i].chasy);
        cyrOut("Введите время (минуты): ");
        scanf("%d",mas_time[i].minuty);
    }
           
 
 
 
 
 
 
 
    return 0;
}
Почему-то ругается на 32 строчку

Добавлено через 2 минуты
Цитата Сообщение от marina2 Посмотреть сообщение
Что-то наподобие такого должно получится
Спасибо, у меня приблизительно так и есть

Добавлено через 2 минуты
Понял почему ругается.
marina2
Рожденная для битвы
 Аватар для marina2
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
07.06.2011, 23:11     Работа со структурами #10
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
struct date mas_date[N];
struct date.vremya mas_time[N];
Мне кажется, это можно в одном массиве создать
cx5xclxxl9
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 23
07.06.2011, 23:55  [ТС]     Работа со структурами #11
Цитата Сообщение от marina2 Посмотреть сообщение
Мне кажется, это можно в одном массиве создать
Ага, видимо, так и нужно было сделать

Добавлено через 37 минут
А каким способом эту структуру можно записать в файл? А то у меня что-то не выходит

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
#include <fstream>
#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
 
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
#define N 2
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date mas_date[N];
    
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i+1<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date[i].chislo;
        cyrOut("Введите месяц (например: Февраль) : \n");
        cin>>mas_date[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date[i].t.minuty;
    }
           
    ofstream os("text.txt");
    os.write(reinterpret_cast<char*>(mas_date),sizeof(mas_date));
    os.close();
 
 
 
 
 
 
 
    return 0;
}
Добавлено через 5 минут
Он мне кракозябры выводит в файл.
marina2
Рожденная для битвы
 Аватар для marina2
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
08.06.2011, 00:01     Работа со структурами #12
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
ofstream os("text.txt");
Это кажется считывание из файла
Попробуй ifstram
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
08.06.2011, 07:50     Работа со структурами #13
C++
1
ofstream os("text.txt", ios::binary);
cx5xclxxl9
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 23
08.06.2011, 23:13  [ТС]     Работа со структурами #14
Всё равно почему-то криво выводит

Добавлено через 1 минуту
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
#include <fstream>
#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
 
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
#define N 2
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date mas_date[N];
    
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i+1<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date[i].chislo;
        cyrOut("Введите месяц (например: Февраль) : \n");
        cin>>mas_date[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date[i].t.minuty;
    }
        FILE *out;
        out = fopen("text.txt", "w");
        fwrite((void*)(&mas_date), sizeof(date), 1, out);
        fclose(out);
 
 
 
 
 
 
    return 0;
}
Попробовал так - тоже криво.

Добавлено через 1 час 24 минуты
Всё, с первой частью вроде разобрался


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
#include <fstream>
#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
 
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
 
 
#define N 2 //Количество дат
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date mas_date[N];
    
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i+1<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date[i].chislo;
        cyrOut("Введите месяц: \n");
        cin>>mas_date[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date[i].t.minuty;
    }
        
 
 
        FILE *fp;
        fp = fopen("date.txt", "w");
        
        for (int i = 0; i < N; i++)
        {
                fprintf(fp, "\n\n*******\n");    
                fprintf(fp, "%d ", mas_date[i].chislo);
                fprintf(fp, "%s ", mas_date[i].mes);
                fprintf(fp, "%d\n", mas_date[i].god);
                fprintf(fp, "%d\:", mas_date[i].t.chasy);
                fprintf(fp, "%d\n", mas_date[i].t.minuty);
        }
        fclose(fp);
    return 0;
}
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
08.06.2011, 23:20     Работа со структурами #15
Цитата Сообщение от accept Посмотреть сообщение
C++
1
ofstream os("text.txt", ios::binary);
Несколько неожиданно видеть бинарный флаг для файла с расширением txt
cx5xclxxl9
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 23
08.06.2011, 23:39  [ТС]     Работа со структурами #16
Теперь у меня проблемы со чтением, компилятор выдаёт ошибку:
"Stack around the variable 'read_date' was corrupted"

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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// laba4.cpp: определяет точку входа для консольного приложения.
//
 
#include <fstream>
#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
 
#define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr
char szStr[512];
 
 
 
#define N 2 //Количество дат
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{ 
    struct date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date mas_date[N];
    
 
    
    for (int i=0;i<N;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i+1<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date[i].chislo;
        cyrOut("Введите месяц: \n");
        cin>>mas_date[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date[i].t.minuty;
    }
        
 
 
        FILE *fp;
        fp = fopen("date.txt", "w");
        
        for (int i = 0; i < N; i++)
        {
                    
                fprintf(fp, "%d ", mas_date[i].chislo);
                fprintf(fp, "%s ", mas_date[i].mes);
                fprintf(fp, "%d\n", mas_date[i].god);
                fprintf(fp, "%d\:", mas_date[i].t.chasy);
                fprintf(fp, "%d\n\n", mas_date[i].t.minuty);
        }
        fclose(fp);
 
        system("PAUSE");
        
 
 
 
        struct date1 {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct date1 mas_date1[N];
 
        struct read_date {
              short chislo;
              char mes[15];
              short god;
              struct vremya {
                short chasy;
                short minuty;
              } t;
 
           };
 
    struct read_date read_date[N];
    
 
    /*cyrOut("\n\n          Введите интервал дат, в котором нужно произвести поиск \n");
    for (int i=1;i<2;i++)
    {
        cyrOut("\n\n*** Дата ");cout<<i<<" ***\n\n";
        cyrOut("Введите число: \n");
        cin>>mas_date1[i].chislo;
        cyrOut("Введите месяц: \n");
        cin>>mas_date1[i].mes;
        cyrOut("Введите год: \n");
        cin>>mas_date1[i].god;
        cyrOut("Введите время (часы): \n");
        cin>>mas_date1[i].t.chasy;
        cyrOut("Введите время (минуты): \n");
        cin>>mas_date1[i].t.minuty;
    } */
 
        FILE *fp1;
        fp1 = fopen("date.txt", "r");
        for (int i = 0; i < N; i++)
        {
                    
                fscanf(fp1, "%d %s %d\n%d\:%d\n\n", &read_date[i].chislo, &read_date[i].mes, &read_date[i].god, &read_date[i].t.chasy, &read_date[i].t.minuty);
                
                
        }
        fclose(fp1);
 
 
 
 
 
 
 
 
    return 0;
}
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
08.06.2011, 23:48     Работа со структурами #17
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
Теперь у меня проблемы со чтением, компилятор выдаёт ошибку:
"Stack around the variable 'read_date' was corrupted"
C
1
fscanf(fp1, "%d %s %d\n%d\:%d\n\n", &read_date[i].chislo, &read_date[i].mes, &read_date[i].god, &read_date[i].t.chasy, &read_date[i].t.minuty);
Возможно это оттого, что считываются переменные short int, а %d означают int.
Для коротких целых нужен шаблон %hd
Ну и для строки тоже не мешало бы ограничивать её длину в шаблоне. Вдруг строка будет больше буфера?
Avazart
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 17
08.06.2011, 23:53     Работа со структурами #18
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int n;
bool flag=0;
FILE *f;
char s[]="a.dat";
 
struct nr
  {
   char  fio[40],dol[10],zv[10];
   int n;
  } b;
//--------------------Добавление структуры в файл--------------------
    if ( (f=fopen(s,"ab+"))==NULL )  { ShowMessage("Файла нет!");return;}
       //....Ввод  полей структуры
    fwrite(&b,sizeof(nr),1,f);
    fclose(f);
//---------------Просмотр----------------
if ( (f=fopen(s,"rb"))==NULL )  { ShowMessage("Файла нет!");return;}
while(fread(&b,sizeof(nr),1,f))
  {
   //... вывод всех структур
  }
fclose(f);
cx5xclxxl9
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 23
09.06.2011, 00:00  [ТС]     Работа со структурами #19
Цитата Сообщение от grizlik78 Посмотреть сообщение
Возможно это оттого, что считываются переменные short int, а %d означают int.
Для коротких целых нужен шаблон %hd
Сработало, спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2011, 00:03     Работа со структурами
Еще ссылки по теме:

Работа со структурами C++
C++ Работа со структурами
C++ Работа со структурами

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,630
Записей в блоге: 17
09.06.2011, 00:03     Работа со структурами #20
Если работаеш с бинарниым файлом то кракозяблы в самом файле это нормально.
Yandex
Объявления
09.06.2011, 00:03     Работа со структурами
Ответ Создать тему
Опции темы

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