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

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

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

Author24 — интернет-сервис помощи студентам
Из файла вводятся записи структурой
имя - стринг,
ТК - место работы тоже структура из 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
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
13.04.2010, 10:28 21
Author24 — интернет-сервис помощи студентам
а формат у текстового файла какой ?
надо чтобы каждая запись была на отдельной строке
0
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
13.04.2010, 10:55  [ТС] 22
.txt
записи я ввожу так
Kolja
svarshik
758457

Vasja
santehnik
325644
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
13.04.2010, 11:58 23
я вот так пока сделал, немного неряшливо но переделать всегда успеешь)
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
typedef struct mesto{
    char AS[50];
    char Tel[50];
};
 
typedef struct chelovek{
    char name[100];
    mesto rabota;
};
 
int main()
{
    clrscr();
 
    char Asutus[50];
    for(short a = 0; a < 50; a++)
        Asutus[a] = 0;
    chelovek info[100];
 
    FILE *base;
    base = fopen("f1.txt", "r");
 
    if(!base){
        printf("Impossible to open file\n");
        getch();
        return 1;
    }
 
    char s1;
    char s2;
    long i;
    char buf[3000];
    char temp[100][30];
    char probel[10];
    int ch, j, j1;
 
    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(!feof(base))
        buf[ch++] = fgetc(base);
    printf("%s\n", buf);
 
    fclose(base);
 
    j1 = j = 0;
    for(i = 0; i < ch; i++){
        while(buf[i] != '\n')
            temp[j1][j++] = buf[i++];
        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");
    scanf("%s", &Asutus);
 
    /*int k;
    chelovek p;
    for(j = 0; j < 100; j++)
        for(k = 0; k < 100; k++)
            if(strcmp(info[j].name, info[k].name) < 0){
                p = info[j];
                info[j] = info[k];
                info[k] = p;
            }
    */
 
    FILE *out;
    out = fopen("f2.txt", "w");
 
    for(i = 0; i < j1; i++){
        ch = j = 0;
        while(info[i].rabota.AS[j] == Asutus[j]){
            j++;
            ch++;
        }
        if(ch-1 == strlen(Asutus)){
            printf("%s\n", info[i].name);
            printf("%s\n", info[i].rabota.AS);
            printf("%s\n", info[i].rabota.Tel);
            fprintf(out, "%s\n", info[i].name);
            fprintf(out, "%s\n", info[i].rabota.AS);
            fprintf(out, "%s\n", info[i].rabota.Tel);
        }
    }
 
    fclose(out);
 
    getch();
    return 0;
}
сортировку я пока закоментил, сейчас попробую ее переделать, а вы пока с этим разберитесь
из файла всю информацию переписываем в массив buf, а из него уже переписываем каждую строку(пока '\n' не встретится) в массив строк temp, с которым намного удобней работать, и из temp мы распределяем все данные в структуры
1
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
13.04.2010, 12:07 24
Выводит на экран содержимое файла, и мы видим что именно мы хотим записать в файл
Миниатюры
Чтение структуры из файла и запись нового  
1
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
13.04.2010, 14:30 25
проверил только что, лучше вместо
C
1
scanf("%s", Asutus);
в 71 строке
использовать
C
1
gets(Asutus);
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
13.04.2010, 17:08  [ТС] 26
ууу всю прогу мне переделали)) только clrscr() не работает, компилятор говорит не задекларировано, как исправить?
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
13.04.2010, 23:25 27
если Visual C++ то system("cls"); но оно, мне кажется, не нужно вначале программы, у меня просто BCPP 3.1 так там экран не очищается после окончания работы программы, вот я и написал по привычке, думаю, можно удалить)
с сортировкой разобрались? там нужно посимвольно сравнивать, ато strcmp(); сравнивает длины строк, а не то, что вы хотели, насколько я понял
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.04.2010, 04:36 28
Цитата Сообщение от artem0n2
Kolja
svarshik
758457
а, ну это тогда можно напрямую считать

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int retval;
 
    i = 0;
 
    while
    (
        (retval = fscanf(base, "%99[^\n]\n%49[^\n]\n%49[^\n]",
            info[i].name, info[i].rabota.AS, info[i].rabota.Tel)) != EOF
    ) {
 
        if (retval != 3)
            fprintf(stderr, "error" "\n");
 
        printf("%s ; %s ; %s " "\n",
            info[i].name, info[i].rabota.AS, info[i].rabota.Tel);
 
        i++;
    }
fgets() из раннего варианта кажется правильнее этого, но там в имена записываются переводы строк, то есть на первый взгляд кажется правильно, а на самом деле надо подчищать (и не только имена, везде, где fgets() встретит перевод строки, она запишет его в строку), и отсутствие какого-нибудь поля в какой-нибудь записи надо будет проверять отдельно, так как fgets() возвращает NULL в двух случаях

я бы разделил это дело

  1. создать структуры

  2. прочитать структуры

  3. если не прочитались
    выйти

  4. вывести структуры

  5. отсортировать структуры

  6. вывести структуры
сначала написал бы все эти функции с псевдо-структурами (как будто они прочитались уже из файла), а потом уже писал бы это чтение структур, его же можно по-разному делать
да и формат если поменяется, что тогда ?
тогда пришлось бы лишь одну функцию заменить во всей программе - чтение структур

Добавлено через 1 минуту
я к тому, что если даже не проверил, как прочитались данные, то и не надо сортировать их
не надо делать всё сразу
0
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
14.04.2010, 16:02  [ТС] 29
accept, ваш вариант ввода не подходит, программа зависает, и я думаю не нужно полностью всё переделывать, к тому же я не особо хорошо в этом разбираюсь.
vorona, я использую dev c++ и он всё равно не хочет компилировать clrscr()
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
14.04.2010, 23:15 30
я же говорю, долой clrscr();
либо system("cls"); либо удалить его вообще)
0
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
15.04.2010, 00:40  [ТС] 31
если убрать clscr() то после компиляции программа выводит весь список и зависает, а system("cls");
не решает вопрос с компиляцией
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
15.04.2010, 01:09 32
ни разу не пользовался Dev C++(
на счет зависания программы без clrscr() - бред какой-то, но все-же:
может стоит подключить
C
1
#include<stdlib.h>
нашел еще такой вариант:
C
1
system("sh -c clear");
или в папке include в файле conio.h (C:\Dev-Cpp\include\conio.h к примеру) прописать ф-цию clrscr() и постараться ее использовать
C
1
2
3
4
5
6
#include<stdio.h>
#include<stdlib.h>
void clrscr()
{
    system("cls");
}
может кто другой в Dev C++ знает, как очистить экран, если это необходимо, т.к. выше - самые адекватные методы, по моему мнению, которые подсказал гугл
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
15.04.2010, 11:53  [ТС] 33
похоже что проблема не в этой функции.

Добавлено через 6 минут
может лучше совместить первый полурабочий вариант программы со вторым? ту часть где сравнение, а считывание с файла таким и оставить?
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
15.04.2010, 13:14 34
попробуйте...
просто у меня все отлично работает и я ничем вам помочь не могу в данной ситуации т.к. не имею опыта в Dev C++, могу код написать, а тут посоветуйтесь с кем-то, у кого встречались данного рода проблемы)
Думаю, если кроме clrscr() компилятор больше не указывает на ошибки, то проблема именно здесь
не могу понять почему этот код не работает
без сортировки
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
typedef struct mesto{
        char AS[50];
        char Tel[50];
};
 
typedef struct chelovek{
        char name[100];
        mesto rabota;
};
 
int main()
{
        char Asutus[50];
        for(short a = 0; a < 50; a++)
                Asutus[a] = 0;
        chelovek info[100];
 
        FILE *base;
        base = fopen("f1.txt", "r");
 
        if(!base){
                printf("Impossible to open file\n");
                getch();
                return 1;
        }
 
        char s1;
        char s2;
        long i;
        char buf[3000];
        char temp[100][30];
        char probel[10];
        int ch, j, j1;
 
        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(!feof(base))
                buf[ch++] = fgetc(base);
        printf("%s\n", buf);
 
        fclose(base);
 
        j1 = j = 0;
        for(i = 0; i < ch; i++){
                while(buf[i] != '\n')
                        temp[j1][j++] = buf[i++];
                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);
 
        FILE *out;
        out = fopen("f2.txt", "w");
 
        for(i = 0; i < j1; i++){
                ch = j = 0;
                while(info[i].rabota.AS[j] == Asutus[j]){
                        j++;
                        ch++;
                }
                if(ch-1 == strlen(Asutus)){
                        printf("%s\n", info[i].name);
                        printf("%s\n", info[i].rabota.AS);
                        printf("%s\n", info[i].rabota.Tel);
                        fprintf(out, "%s\n", info[i].name);
                        fprintf(out, "%s\n", info[i].rabota.AS);
                        fprintf(out, "%s\n", info[i].rabota.Tel);
                }
        }
 
        fclose(out);
 
        getch();
        return 0;
}
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
16.04.2010, 13:19  [ТС] 35
да буду шаманить, спасибо за помощь

Добавлено через 18 часов 14 минут
ничего не работает
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
16.04.2010, 16:11 36
не компилирует? какие ошибки пишет?
что-то столь простая тема удивительно затягивается...странно
может так?
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
#include <cstdio>
#include <conio.h>
#include <cstring>
 
typedef struct mesto{
        char AS[50];
        char Tel[50];
};
 
typedef struct chelovek{
        char name[100];
        mesto rabota;
};
 
int main()
{
        char Asutus[50];
        for(short a = 0; a < 50; a++)
                Asutus[a] = 0;
        chelovek info[100];
 
        FILE *base;
        base = fopen("f1.txt", "r");
 
        if(!base){
                printf("Impossible to open file\n");
                getch();
                return 1;
        }
 
        char s1;
        char s2;
        long i;
        char buf[3000];
        char temp[100][30];
        char probel[10];
        int ch, j, j1;
 
        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(!feof(base))
                buf[ch++] = fgetc(base);
        printf("%s\n", buf);
 
        fclose(base);
 
        j1 = j = 0;
        for(i = 0; i < ch; i++){
                while(buf[i] != '\n')
                        temp[j1][j++] = buf[i++];
                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);
 
        FILE *out;
        out = fopen("f2.txt", "w");
 
        for(i = 0; i < j1; i++){
                ch = j = 0;
                while(info[i].rabota.AS[j] == Asutus[j]){
                        j++;
                        ch++;
                }
                if(ch-1 == strlen(Asutus)){
                        printf("%s\n", info[i].name);
                        printf("%s\n", info[i].rabota.AS);
                        printf("%s\n", info[i].rabota.Tel);
                        fprintf(out, "%s\n", info[i].name);
                        fprintf(out, "%s\n", info[i].rabota.AS);
                        fprintf(out, "%s\n", info[i].rabota.Tel);
                }
        }
 
        fclose(out);
 
        getch();
        return 0;
}
0
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
16.04.2010, 17:52  [ТС] 37
так тоже зависает, открывается программа, выводится сразу весь список и винда говорит stopped working. а мой изначальный вариант - там после ввода информации из текстового файла я прописал просто вывод чтобы посмотреть как он видит её, результат тоже очень странный, сначала идёт список весь, затем куча символов.
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
16.04.2010, 19:07 38
очередная попытка
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
#include <cstdio>
#include <conio.h>
#include <cstring>
 
typedef struct mesto{
        char AS[50];
        char Tel[50];
};
 
typedef struct chelovek{
        char name[100];
        mesto rabota;
};
 
int main()
{
        char Asutus[50];
        for(short a = 0; a < 50; a++)
                Asutus[a] = 0;
        chelovek info[100];
 
        FILE *base;
        base = fopen("f1.txt", "r");
 
        if(!base){
                printf("Impossible to open file\n");
                getch();
                return 1;
        }
 
        char s1;
        char s2;
        long i;
        char buf[3000];
        char temp[100][30];
        char probel[10];
        int ch, j, j1;
 
        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(!feof(base))
                buf[ch++] = fgetc(base);
        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);
 
        FILE *out;
        out = fopen("f2.txt", "w");
 
        for(i = 0; i < j1; i++){
                ch = j = 0;
                while(info[i].rabota.AS[j] == Asutus[j]){
                        j++;
                        ch++;
                }
                if(ch-1 == strlen(Asutus)){
                        printf("%s\n", info[i].name);
                        printf("%s\n", info[i].rabota.AS);
                        printf("%s\n", info[i].rabota.Tel);
                        fprintf(out, "%s\n", info[i].name);
                        fprintf(out, "%s\n", info[i].rabota.AS);
                        fprintf(out, "%s\n", info[i].rabota.Tel);
                }
        }
 
        fclose(out);
 
        getch();
        return 0;
}
заставить ее работать))
если что, замените заголовочные файлы
C
1
2
3
#include <cstdio>
#include <conio.h>
#include <cstring>
на
C
1
2
3
#include <stdio.h>
#include <conio.h>
#include <string.h>
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
16.04.2010, 19:14  [ТС] 39
этот вариант не зависает, он выводит весь список сначала, затем спрашивает работу, и потом ничего не происходит, ни сравнение не запись... но зато ввод данных из файла работает правильно
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
16.04.2010, 19:29 40
у нас есть три строки с информацией о человеке, потом пустая строка и новый человек, хм...
на студии переделал, выводит все четко
вот, попробуйте вставить эту строку в 67 строке того кода, что я вам сбросил и проверьте или верно пишет информацию о втором человеке, или нет пропусков или нестыковок и скажите результат)
C
1
printf("\n%s\n%s\n%s", info[1].name, info[1].rabota.AS, info[1].rabota.Tel);
Миниатюры
Чтение структуры из файла и запись нового  
1
16.04.2010, 19:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2010, 19:29
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru