Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.74/140: Рейтинг темы: голосов - 140, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
1

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

06.04.2010, 16:27. Просмотров 27632. Ответов 72
Метки нет (Все метки)

Из файла вводятся записи структурой
имя - стринг,
ТК - место работы тоже структура из 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 {
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2010, 16:27
Ответы с готовыми решениями:

Чтение структуры из файла и запись нового - C++
Помогите написать данную программу. На магнитном диске подготовлен файл данных такой структуры:...

Запись и чтение структуры из файла
Нужно ввести структуру с клавиатуры, записать её в файл и потом прочитать из него. Пока что читает...

Запись и чтение структуры с файла
Привет всем.Столкнулся с проблема записи структуры в файл и чтения ее из файла.Вот сама структура:...

Запись и чтение структуры из файла
Здравствуйте, у меня дано такое задание: Составить программу &quot;Список студентов группы&quot;, в котором...

72
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,283
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 предоставит нам кол-во байтов в файле
0
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) но тогда вообще не выводит никаких результатов.
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,283
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;
}
проверяйте)
1
4848 / 3269 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
20.04.2010, 08:20 64
Цитата Сообщение от artem0n2
accept спасибо за проделанную работу и за объяснение, однако смотрите скриншот....
ну, скриншот в порядке, там была остановка на первом найденном

насчёт dev-cpp - всё будет запускаться
должна быть реакция на gets() только
(вообще wiki есть, но вкратце - dev-cpp включает mingw и оболочку (окна))
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
20.04.2010, 08:25  [ТС] 65
урааа работает))) попробую добавить упорядочивание
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,283
20.04.2010, 13:03 66
с сортировкой аналогично проверке работайте, посимвольно сравнивайте, если первые буквы одинаковые, то сравнивайте вторые буквы, если разные, значит сортировать слова
ато вы ф-цию strcmp() использовали, а она только длины строк сравнивает
1
Эксперт С++
5017 / 2596 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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.
Она так же сравнивает посимвольно до нуль-терминатора
2
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);
}
? я попробовал в разные части эту функцию записать, но безрезультатно, для вас наверно это не сложно
0
4848 / 3269 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
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);
}
1
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);
}
0
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
22.04.2010, 16:59 71
Рябята подскажите пожалуйста как мне реализовать вот эту фишку в моём задании
Задание:
Структура содержит название, цену, количество товара. Удалить из списка партии товара, превышающие заданную стоимость

Со структурой как бы ясно, но мне нужно чтобы в меню была кнопка "коректировка" с помощью которой можно удалять из списка партии товара превышающие заданную стоимость
0
4848 / 3269 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
23.04.2010, 09:56 72
Цитата Сообщение от artem0n2
ваш вариант с поправкой не совсем правильно работал, но я посмотрел как правильно записать сортировку и теперь всё отлично работает
последний вариант содержит поправки без которых программа работает неправильно

Добавлено через 2 минуты
там ch не обнулялось, и на шесть структур работало j1 (которое считает строки в файле)
0
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
27.04.2010, 18:01  [ТС] 73
программу сдал, делаю другую =) всем спасибо ещё раз.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2010, 18:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Запись структуры и её чтение из файла
пробовал разными способами, ничего не работает, не записывает и не считывает...

Запись и чтение структуры в/из файла
Столкнулся с очередной проблемой. Есть несколько участков кода: Структура &quot;Абонент&quot;: struct...

Запись и чтение структуры из бинарного файла
Проблема заключается в том, что, когда идёт запись и считка с бин. файла - нормально выводит лишь...

Запись/чтение вектора в/из файла.Структуры
Доброе время суток.Проблема заключается в следующем: в файл идет запись вектора (запись вроде-бы...


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

Или воспользуйтесь поиском по форуму:
73
Ответ Создать тему
Опции темы

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