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

Чтение структуры из файла и запись нового - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 103, средняя оценка - 4.93
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
06.04.2010, 16:27     Чтение структуры из файла и запись нового #1
Из файла вводятся записи структурой
имя - стринг,
ТК - место работы тоже структура из AS - место (стринг), Tel - телефон
с клавиатуры вводится стринг Asutus (место работы)
программа записывает во второй файл записываются совподающие по месту работы люди и их данные.

можно ли так записать структуру в структуре?
как сделать правильное считывание данных по нескольким людям с файла?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <string.h>
 
typedef struct {
        char name[100]; //имя человека
        typedef struct { //структура для места работы этого человека
                char AS[50]; //название места
                int Tel; //телефон
                } mesto;
                } chelovek;
main() {
       int i=0; j=0;
       char Asutus[50]; //то место работы которое вводится с клавиатуры и с ним идёт потом сравнение
       mesto data[500]; //массивы
       chelovek info[500];
       FILE *base; //хз шаблон
       base=fopen("f1.txt","r");
       do {
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
19.04.2010, 14:50     Чтение структуры из файла и запись нового #61
так accept ведь написал, как правильно будет)
во всяком случае с концом файла проблем пока нет, а вот со сравнением работ - есть..
в конец файла можно запросто перейти до символа eof и узнать количество байтов:
C++
1
2
3
4
5
#include<fstream>
.......
std::ifstream in("f1.txt");
in.seekg(0, std::ios::end);
long i = (long)in.tellg();
i предоставит нам кол-во байтов в файле
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
19.04.2010, 14:57  [ТС]     Чтение структуры из файла и запись нового #62
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while(!feof(base))
        {
                fgets (buf, 100, base);
                strcpy (info[i].name, buf);
 
                fgets (buf, 50, base);
                strcpy (info[i].rabota.AS, buf);
 
                fgets (buf, 50, base);
                strcpy (info[i].rabota.Tel, buf);
                
                fgets (buf, 50, base);
                strcpy (info[i].stroka, buf);   
                i++;
        }
 for(int i = 0;i<20;i++){
         printf("%s",info[i].name);
         printf("%s",info[i].rabota.AS);
         printf("%s\n",info[i].rabota.Tel);
         }
вроде правильно всё с файлом, просто тут дело в цикле for i < число. от этого числа зависит сколько пустых строк он будет выводить в ответе... интересно...

Добавлено через 2 минуты
да тут чёто со сравнением, ну
C++
1
if(strcmp(info[i].rabota.AS, Asutus) == 1)
точно не правильно, сдесь должно быть if(strcmp(info[i].rabota.AS, Asutus) == 0) но тогда вообще не выводит никаких результатов.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
20.04.2010, 05:16     Чтение структуры из файла и запись нового #63
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
#include <stdio.h>
#include <string.h>
 
typedef struct mesto{
    char AS[50];
    char Tel[50];
} mesto;
 
typedef struct chelovek{
    char name[100];
    mesto rabota;
} chelovek;
 
int main(void)
{
    char Asutus[50];
    short a;
    long i;
    char buf[3000];
    char temp[100][30];
    int ch, j, j1;
    FILE *base;
    chelovek info[100];
    FILE *out;
    int c;
 
    for(a = 0; a < 50; a++)
        Asutus[a] = 0;
 
    base = fopen("f1.txt", "r");
 
    if(!base){
    printf("Impossible to open file\n");
        getchar();
        return 1;
    }
 
    for(i = 0; i < 100; i++)
     for(j = 0; j < 30; j++)
         temp[i][j] = 0;
 
    for(i = 0; i < 3000; i++)
     buf[i] = 0;
 
    ch = 0;
    while((c = fgetc(base)) != EOF)
     buf[ch++] = c;
    printf("%s\n", buf);
 
    fclose(base);
 
    j1 = j = 0;
    for(i = 0; i < ch; i++){
     if(buf[i] != '\n')
         temp[j1][j++] = buf[i];
     else{
             j1++;
             j = 0;
     }
    }
    for(i = j = 0; i < j1;){
        strcpy (info[j].name,       temp[i++]);
        strcpy (info[j].rabota.AS,  temp[i++]);
        strcpy (info[j].rabota.Tel, temp[i++]);
        i++;
    j++;
    }
    printf("\nWhat kind of job?\n");
    gets(Asutus);
    
    out = fopen("f2.txt", "w"); 
    for(i = 0; i < j1; i++){
        for(ch = j = 0; j < strlen(Asutus); j++)
        if(info[i].rabota.AS[j] == Asutus[j])
            ch++;
    if(ch == strlen(Asutus)){
            printf("%s\n", info[i].name);
            printf("%s\n", info[i].rabota.AS);
            printf("%s\n\n", info[i].rabota.Tel);
            fprintf(out, "%s\n", info[i].name);
            fprintf(out, "%s\n", info[i].rabota.AS);
        fprintf(out, "%s\n\n", info[i].rabota.Tel);
        }    
    }
    fclose(out);
    getchar();
    return 0;
}
проверяйте)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.04.2010, 08:20     Чтение структуры из файла и запись нового #64
Цитата Сообщение от artem0n2
accept спасибо за проделанную работу и за объяснение, однако смотрите скриншот....
ну, скриншот в порядке, там была остановка на первом найденном

насчёт dev-cpp - всё будет запускаться
должна быть реакция на gets() только
(вообще wiki есть, но вкратце - dev-cpp включает mingw и оболочку (окна))
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
20.04.2010, 08:25  [ТС]     Чтение структуры из файла и запись нового #65
урааа работает))) попробую добавить упорядочивание
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
20.04.2010, 13:03     Чтение структуры из файла и запись нового #66
с сортировкой аналогично проверке работайте, посимвольно сравнивайте, если первые буквы одинаковые, то сравнивайте вторые буквы, если разные, значит сортировать слова
ато вы ф-цию strcmp() использовали, а она только длины строк сравнивает
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.04.2010, 13:17     Чтение структуры из файла и запись нового #67
Цитата Сообщение от Vorona Посмотреть сообщение
ато вы ф-цию strcmp() использовали, а она только длины строк сравнивает
Как же так...
Compares the C string str1 to the C string str2.
This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminanting null-character is reached.
Она так же сравнивает посимвольно до нуль-терминатора
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
21.04.2010, 17:50  [ТС]     Чтение структуры из файла и запись нового #68
accept, как правильно вставить в мой код сортировку вам предложенную
C++
1
2
3
4
5
6
7
8
9
10
11
12
int cmpfunc(const void *, const void *);
 
...
 
qsort(info, 99, sizeof info[0], &cmpfunc);
 
...
 
int cmpfunc(const void *s1, const void *s2)
{
    return strcmp(((chelovek *) s1)->name, ((chelovek *) s2)->name);
}
? я попробовал в разные части эту функцию записать, но безрезультатно, для вас наверно это не сложно
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.04.2010, 05:44     Чтение структуры из файла и запись нового #69
там ещё поправил
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
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
 
typedef struct mesto{
        char AS[50];
        char Tel[50];
} mesto;
 
typedef struct chelovek{
        char name[100];
        mesto rabota;
} chelovek;
 
int NameCmp(const void *, const void *);
 
 
int main(void)
{
        char Asutus[50];
        short a;
        long i;
        char buf[3000];
        char temp[100][30];
        int ch, j, j1;
        FILE *base;
        chelovek info[100];
        FILE *out;
        int c; 
 
        for(a = 0; a < 50; a++)
                Asutus[a] = 0;
 
        base = fopen("f1.txt", "r");
 
        if(!base){
                printf("Impossible to open file\n");
                getchar();
                return 1;
        }
 
        
        for(i = 0; i < 100; i++)
                for(j = 0; j < 30; j++)
                        temp[i][j] = 0;
 
        for(i = 0; i < 3000; i++)
                buf[i] = 0;
 
        ch = 0;
        while((c = fgetc(base)) != EOF)
                buf[ch++] = c;
        /* printf("%s\n", buf); */
 
        fclose(base);
 
        j1 = j = 0;
        for(i = 0; i < ch; i++){
                if(buf[i] != '\n')
                        temp[j1][j++] = buf[i];
                else{
                        j1++;
                        j = 0;
                }
                        
        }
        
        for(i = j = 0; i < j1;){
                strcpy (info[j].name,       temp[i++]);
                strcpy (info[j].rabota.AS,  temp[i++]);
                strcpy (info[j].rabota.Tel, temp[i++]);
                i++;
                j++;
        }
 
#if 1 
        printf("%d" "\n", j);
 
        for (i = 0; i < j; i++) {
            printf("%s ", info[i].name);
            printf("%s ", info[i].rabota.AS);
            printf("%s ", info[i].rabota.Tel);
            printf("\n");
        } 
#endif
 
        qsort(
            info,
            j,
            sizeof info[0],
            NameCmp
        );
        
        printf("\nWhat kind of job?\n");
        gets(Asutus);
        
        out = fopen("f2.txt", "w");
        
        ch = 0;
        for(i = 0; i < j; i++){
                for(j = 0; j < strlen(Asutus); j++)
                      if(info[i].rabota.AS[j] == Asutus[j]){
                            ch++;
                }
                if(ch == strlen(Asutus)){
                    printf("%s ", info[i].name);
                    printf("%s ", info[i].rabota.AS);
                    printf("%s ", info[i].rabota.Tel);
                    printf("\n");
                    fprintf(out, "%s\n", info[i].name);
                    fprintf(out, "%s\n", info[i].rabota.AS);
                    fprintf(out, "%s\n", info[i].rabota.Tel);
                    fprintf(out, "\n");
                    ch = 0;
                }
        }
        fclose(out);
 
        getchar();
        return 0;
}
 
int NameCmp(const void *s1, const void *s2)
{
    return strcmp(((chelovek *) s1)->name, ((chelovek *) s2)->name);
}
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
22.04.2010, 13:28  [ТС]     Чтение структуры из файла и запись нового #70
ваш вариант с поправкой не совсем правильно работал, но я посмотрел как правильно записать сортировку и теперь всё отлично работает, спасибо accept
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
typedef struct mesto{
    char AS[50];
    char Tel[50];
} mesto;
 
typedef struct chelovek{
    char name[100];
    mesto rabota;
} chelovek;
int NameCmp(const void *, const void *);
int main(void)
{
    char Asutus[50];
    short a;
    long i;
    char buf[3000];
    char temp[100][30];
    int ch, j, j1;
    FILE *base;
    chelovek info[100];
    FILE *out;
    int c;
 
    for(a = 0; a < 50; a++)
        Asutus[a] = 0; //tak ydobnee sravnivat
 
    base = fopen("f1.txt", "r");
 
    if(!base){
        printf("Impossible to open file\n");
        getchar();
        return 1;
    }
 
    for(i = 0; i < 100; i++)
         for(j = 0; j < 30; j++)
             temp[i][j] = 0; //sozdajem dvumernij massiv
 
    for(i = 0; i < 3000; i++)
         buf[i] = 0;
 
    ch = 0;
    while((c = fgetc(base)) != EOF) //4tobi pravilno nahodit konec faila
         buf[ch++] = c;
    printf("%s\n", buf);
 
    fclose(base); //zakrivaem f1
 
    j1 = j = 0;
    for(i = 0; i < ch; i++){
         if(buf[i] != '\n')
             temp[j1][j++] = buf[i];
         else{
             j1++;
             j = 0;
         }
    }
    for(i = j = 0; i < j1;){
        strcpy (info[j].name,       temp[i++]);
        strcpy (info[j].rabota.AS,  temp[i++]);
        strcpy (info[j].rabota.Tel, temp[i++]);
        i++;
        j++;
    }
 
 
        qsort(
            info,
            j,
            sizeof info[0],
            NameCmp
        );
    printf("\nWhat kind of job?\n");
    gets(Asutus);
 
    out = fopen("f2.txt", "w"); 
    for(i = 0; i < j1; i++){
        for(ch = j = 0; j < strlen(Asutus); j++)
            if(info[i].rabota.AS[j] == Asutus[j])
                ch++;
        if(ch == strlen(Asutus)){
            printf("\n%s\n", info[i].name);
            printf("%s\n", info[i].rabota.AS);
            printf("%s\n\n", info[i].rabota.Tel);
            fprintf(out, "%s\n", info[i].name);
            fprintf(out, "%s\n", info[i].rabota.AS);
            fprintf(out, "%s\n\n", info[i].rabota.Tel);
        }    
    }
    fclose(out);
    getchar();
    return 0;
}
int NameCmp(const void *s1, const void *s2)
{
    return strcmp(((chelovek *) s1)->name, ((chelovek *) s2)->name);
}
mastar
 Аватар для mastar
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
22.04.2010, 16:59     Чтение структуры из файла и запись нового #71
Рябята подскажите пожалуйста как мне реализовать вот эту фишку в моём задании
Задание:
Структура содержит название, цену, количество товара. Удалить из списка партии товара, превышающие заданную стоимость

Со структурой как бы ясно, но мне нужно чтобы в меню была кнопка "коректировка" с помощью которой можно удалять из списка партии товара превышающие заданную стоимость
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.04.2010, 09:56     Чтение структуры из файла и запись нового #72
Цитата Сообщение от artem0n2
ваш вариант с поправкой не совсем правильно работал, но я посмотрел как правильно записать сортировку и теперь всё отлично работает
последний вариант содержит поправки без которых программа работает неправильно

Добавлено через 2 минуты
там ch не обнулялось, и на шесть структур работало j1 (которое считает строки в файле)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2010, 18:01     Чтение структуры из файла и запись нового
Еще ссылки по теме:

Запись структуры и чтение из файла в структуру ( как бы лучше ) C++
Чтение/запись структуры C++
Запись и чтение структуры в/из файла C++

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

Или воспользуйтесь поиском по форуму:
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
27.04.2010, 18:01  [ТС]     Чтение структуры из файла и запись нового #73
программу сдал, делаю другую =) всем спасибо ещё раз.
Yandex
Объявления
27.04.2010, 18:01     Чтение структуры из файла и запись нового
Ответ Создать тему
Опции темы

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