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

С++ для начинающих

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

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

07.06.2011, 21:00. Просмотров 5899. Ответов 30
Метки нет (Все метки)

Имеется вот такая задача:

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

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++
Известны данные о численности населения и площади 10 государств. Определить государство с максимальной плотностью населения. P.S. ...

Работа со структурами - C++
#include<iostream.h> #include<math.h> struct List { float fi,r,z; int n; }; void vvod...

Работа со структурами - C++
Помогите написать программу подобного рода: Работа со структурами. Программа должна содержать функции, необходимые для выполнения...

Работа со структурами - C++
Цель работы: научиться объявлять структуру и работать с ее по-лями Помогите пожалуйста. Нужно вот такую программку написать. ...

Работа со структурами - C++
Сегодня преподаватель огорошил известием что к завтрашнему дню надо сдать лабораторную по Работе со структурами. Было бы хорошо. НО он...

Работа с структурами - C++
#include <cstdlib> #include <iostream> using namespace std; struct struc{ char* a; int x; }

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
marina2
Рожденная для битвы
272 / 50 / 5
Регистрация: 08.11.2009
Сообщений: 1,020
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
Рожденная для битвы
272 / 50 / 5
Регистрация: 08.11.2009
Сообщений: 1,020
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
Рожденная для битвы
272 / 50 / 5
Регистрация: 08.11.2009
Сообщений: 1,020
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
Рожденная для битвы
272 / 50 / 5
Регистрация: 08.11.2009
Сообщений: 1,020
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
Рожденная для битвы
272 / 50 / 5
Регистрация: 08.11.2009
Сообщений: 1,020
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
Рожденная для битвы
272 / 50 / 5
Регистрация: 08.11.2009
Сообщений: 1,020
08.06.2011, 00:01     Работа со структурами #12
Цитата Сообщение от cx5xclxxl9 Посмотреть сообщение
ofstream os("text.txt");
Это кажется считывание из файла
Попробуй ifstram
accept
4821 / 3241 / 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
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
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
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
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
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,387
Записей в блоге: 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++
#include&lt;conio.h&gt; #include&lt;iostream.h&gt; #include&lt;string.h&gt; main() { int n=0, i, zapros, flag=0; char s; ...

Работа со структурами - C++
#include&lt;iostream.h&gt; #include&lt;math.h&gt; struct List { float fi,r,z; int n; }; void vvod (List &amp;, int); void vivod (List...

Работа со структурами - C++
Подскажите почему ничего не выводится? Когда жму CTRL-F5 выдаёт что есть ошибки, хотя в коде ничего не подсвечивается. #include...

Работа со структурами. - C++
Здраствуйте! Текст задания : Создать программу, позволяющую вводить элементы массива структур (размерность массива не более 20...

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


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

Или воспользуйтесь поиском по форуму:
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,387
Записей в блоге: 17
09.06.2011, 00:03     Работа со структурами #20
Если работаеш с бинарниым файлом то кракозяблы в самом файле это нормально.
Yandex
Объявления
09.06.2011, 00:03     Работа со структурами
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru