Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.04.2010, 10:28     Чтение структуры из файла и запись нового #21
а формат у текстового файла какой ?
надо чтобы каждая запись была на отдельной строке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
13.04.2010, 10:55  [ТС]     Чтение структуры из файла и запись нового #22
.txt
записи я ввожу так
Kolja
svarshik
758457

Vasja
santehnik
325644
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
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 мы распределяем все данные в структуры
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
13.04.2010, 12:07     Чтение структуры из файла и запись нового #24
Выводит на экран содержимое файла, и мы видим что именно мы хотим записать в файл
Миниатюры
Чтение структуры из файла и запись нового  
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
13.04.2010, 14:30     Чтение структуры из файла и запись нового #25
проверил только что, лучше вместо
C
1
scanf("%s", Asutus);
в 71 строке
использовать
C
1
gets(Asutus);
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
13.04.2010, 17:08  [ТС]     Чтение структуры из файла и запись нового #26
ууу всю прогу мне переделали)) только clrscr() не работает, компилятор говорит не задекларировано, как исправить?
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
13.04.2010, 23:25     Чтение структуры из файла и запись нового #27
если Visual C++ то system("cls"); но оно, мне кажется, не нужно вначале программы, у меня просто BCPP 3.1 так там экран не очищается после окончания работы программы, вот я и написал по привычке, думаю, можно удалить)
с сортировкой разобрались? там нужно посимвольно сравнивать, ато strcmp(); сравнивает длины строк, а не то, что вы хотели, насколько я понял
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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 минуту
я к тому, что если даже не проверил, как прочитались данные, то и не надо сортировать их
не надо делать всё сразу
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
14.04.2010, 16:02  [ТС]     Чтение структуры из файла и запись нового #29
accept, ваш вариант ввода не подходит, программа зависает, и я думаю не нужно полностью всё переделывать, к тому же я не особо хорошо в этом разбираюсь.
vorona, я использую dev c++ и он всё равно не хочет компилировать clrscr()
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
14.04.2010, 23:15     Чтение структуры из файла и запись нового #30
я же говорю, долой clrscr();
либо system("cls"); либо удалить его вообще)
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
15.04.2010, 00:40  [ТС]     Чтение структуры из файла и запись нового #31
если убрать clscr() то после компиляции программа выводит весь список и зависает, а system("cls");
не решает вопрос с компиляцией
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
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++ знает, как очистить экран, если это необходимо, т.к. выше - самые адекватные методы, по моему мнению, которые подсказал гугл
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
15.04.2010, 11:53  [ТС]     Чтение структуры из файла и запись нового #33
похоже что проблема не в этой функции.

Добавлено через 6 минут
может лучше совместить первый полурабочий вариант программы со вторым? ту часть где сравнение, а считывание с файла таким и оставить?
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
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;
}
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
16.04.2010, 13:19  [ТС]     Чтение структуры из файла и запись нового #35
да буду шаманить, спасибо за помощь

Добавлено через 18 часов 14 минут
ничего не работает
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
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;
}
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
16.04.2010, 17:52  [ТС]     Чтение структуры из файла и запись нового #37
так тоже зависает, открывается программа, выводится сразу весь список и винда говорит stopped working. а мой изначальный вариант - там после ввода информации из текстового файла я прописал просто вывод чтобы посмотреть как он видит её, результат тоже очень странный, сначала идёт список весь, затем куча символов.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
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>
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
16.04.2010, 19:14  [ТС]     Чтение структуры из файла и запись нового #39
этот вариант не зависает, он выводит весь список сначала, затем спрашивает работу, и потом ничего не происходит, ни сравнение не запись... но зато ввод данных из файла работает правильно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2010, 19:29     Чтение структуры из файла и запись нового
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
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);
Миниатюры
Чтение структуры из файла и запись нового  
Yandex
Объявления
16.04.2010, 19:29     Чтение структуры из файла и запись нового
Ответ Создать тему
Опции темы

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