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

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

06.04.2010, 16:27. Показов 34273. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.04.2010, 16:27
Ответы с готовыми решениями:

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

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

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

72
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
19.04.2010, 14:50
Студворк — интернет-сервис помощи студентам
так 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  [ТС]
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
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
20.04.2010, 05:16
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
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.04.2010, 08:20
Цитата Сообщение от artem0n2
accept спасибо за проделанную работу и за объяснение, однако смотрите скриншот....
ну, скриншот в порядке, там была остановка на первом найденном

насчёт dev-cpp - всё будет запускаться
должна быть реакция на gets() только
(вообще wiki есть, но вкратце - dev-cpp включает mingw и оболочку (окна))
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
20.04.2010, 08:25  [ТС]
урааа работает))) попробую добавить упорядочивание
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
20.04.2010, 13:03
с сортировкой аналогично проверке работайте, посимвольно сравнивайте, если первые буквы одинаковые, то сравнивайте вторые буквы, если разные, значит сортировать слова
ато вы ф-цию strcmp() использовали, а она только длины строк сравнивает
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
20.04.2010, 13:17
Цитата Сообщение от 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  [ТС]
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
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.04.2010, 05:44
там ещё поправил
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  [ТС]
ваш вариант с поправкой не совсем правильно работал, но я посмотрел как правильно записать сортировку и теперь всё отлично работает, спасибо 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
 Аватар для mastar
0 / 0 / 0
Регистрация: 04.04.2010
Сообщений: 63
22.04.2010, 16:59
Рябята подскажите пожалуйста как мне реализовать вот эту фишку в моём задании
Задание:
Структура содержит название, цену, количество товара. Удалить из списка партии товара, превышающие заданную стоимость

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

Добавлено через 2 минуты
там ch не обнулялось, и на шесть структур работало j1 (которое считает строки в файле)
0
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
27.04.2010, 18:01  [ТС]
программу сдал, делаю другую =) всем спасибо ещё раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.04.2010, 18:01

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
73
Ответ Создать тему
Новые блоги и статьи
BitTorrent (версия 7.11 English) и Меню Настройки
russiannick 15.11.2026
Пункты, отвечающие за отключение обновлений в BitTorrent версии 7. 11 (английской) Options Preferences General Language
Транслитерация текста с кириллицы на латиницу (вариант №4)
Maks 15.11.2026
Что-то я перемудрил с предыдущими версиями, в этот раз сделал всё проще, обратившись к функции "СтрокаЛатиницей" из типового общего модуля "СтроковыеФункцииКлиент". В данной функции нет апострофов,. . .
BitTorrent (версия 4.3.9) и Меню Настройки
russiannick 15.11.2026
В меню Настройки можно отключить автоматическое обновление программы. Карта этого меню приложена ниже. Нужный пункт выделен красным. Сервис Настройки Поведение
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru