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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 103, средняя оценка - 4.93
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
#1

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

06.04.2010, 16:27. Просмотров 15533. Ответов 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 {
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2010, 16:27     Чтение структуры из файла и запись нового
Посмотрите здесь:
C++ Запись и чтение структуры с файла
Запись и чтение структуры из файла C++
C++ Запись структуры и её чтение из файла
Запись и чтение структуры в/из файла C++
Запись и чтение структуры из бинарного файла C++
C++ Запись/чтение вектора в/из файла.Структуры
Запись структуры и чтение из файла в структуру ( как бы лучше ) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
12.04.2010, 13:39  [ТС]     Чтение структуры из файла и запись нового #16
компилятору не нравится =( почему используется int cmpfunc для сортировки, если name у меня char?

Добавлено через 23 минуты
http://www.cyberforum.ru/cpp-beginners/thread82932.html
вот то что мне надо, не могу совместить со своей прогой из-за того, что там человек использует void функции

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int j,k;
 chelovek p;
 for(j=0; j<99; j++)
  {
   for(k=0; k<99; k++)
    {
     if(strcmp(chelovek[j].name,info[k].name)<0)
          {
       p=info[j];
       info[j]=info[k];
       info[k]=p;
      }
    }
  }
вставил после ввода данных, не работает

Добавлено через 5 минут
нашёл ошибку, сделал упорядочивание, осталось немного сделать, вот прога
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
typedef struct
{ 
char AS[50];
char Tel[50];
} mesto;
 
typedef struct
{
char name[100];
mesto rabota;
} chelovek;
 
int main()
{
        char Asutus[50];
        chelovek info[500];
        FILE *base;
        base=fopen("f1.txt","r");
        char s1;
        char s2;
        int i = 0;
        char buf[100];
        
        
        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);      
                i++;
        }
        printf("What kind of job?  ");
        scanf("%s", &Asutus);
int j,k;
 chelovek p;
 for(j=0; j<99; j++)
  {
   for(k=0; k<99; k++)
    {
     if(strcmp(info[j].name,info[k].name)<0)
          {
       p=info[j];
       info[j]=info[k];
       info[k]=p;
      }
    }
  }        
        
for(int i = 0;i<99;i++){
        if(strcmp(info[i].rabota.AS, Asutus) == 1){
                                      printf("%s",info[i].name);
                                      printf("%s",info[i].rabota.AS);
                                      printf("%s",info[i].rabota.Tel);
                                      }
        
        
        }
 
 
 
        
 
getch();
}
Добавлено через 17 минут
всё, самый последний вопрос по этой программе, как сдлать чтобы она записывала результаты сравнения в отдельный txt файл?
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,276
12.04.2010, 14:24     Чтение структуры из файла и запись нового #17
C
1
2
3
4
5
6
7
8
...
char somedata[25] = {"This text copies to file"};
FILE *out;
out = fopen("f2.txt", w);
...
fprintf(out, "%s", somedata);
...
fclose(out);
fprintf() имеет ту же конструкцию, что и printf(), только вначале нужно указать поток вывода в файл, здесь - это out
не забываем в конце программы закрывать поток (у вас):
C
1
fclose(base);
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
12.04.2010, 17:28  [ТС]     Чтение структуры из файла и запись нового #18
Всем большое спасибо, кто помог довести до ума программу. Теперь я имею представление о работе с файлами в с++. Вот итог
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 <conio.h>
#include <string.h>
 
typedef struct
{ 
char AS[50];
char Tel[50];
} mesto;
 
typedef struct
{
char name[100];
mesto rabota;
} chelovek;
 
int main()
{
        char Asutus[50];
        chelovek info[500];
        FILE *base;
        base=fopen("f1.txt","r");
        char s1;
        char s2;
        int i = 0;
        char buf[100];
        char probel[10];
        
        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 (probel, buf); // это чтобы записывать в блокноте людей через одну пустую строку.   
                i++;
        }
        printf("What kind of job?  ");
        scanf("%s", &Asutus);
int j,k;
 chelovek p;
 for(j=0; j<99; j++)
  {
   for(k=0; k<99; k++)
    {
     if(strcmp(info[j].name,info[k].name)<0)
          {
       p=info[j];
       info[j]=info[k];
       info[k]=p;
      }
    }
  }        
        
for(int i = 0;i<99;i++){
        if(strcmp(info[i].rabota.AS, Asutus) == 1){
                                      printf("%s",info[i].name);
                                      printf("%s",info[i].rabota.AS);
                                      printf("%s\n",info[i].rabota.Tel);
                                      }
        
        
        }
FILE *out;
out = fopen("f2.txt", "w");
for(int i = 0;i<99;i++){
        if(strcmp(info[i].rabota.AS, Asutus) == 1) {
        fprintf(out, "%s",info[i].name);
        fprintf(out, "%s",info[i].rabota.AS);
        fprintf(out, "%s\n",info[i].rabota.Tel);
        }
        }
fclose(out);
fclose(base);
 
 
 
        
 
getch();
}
Добавлено через 1 час 21 минуту
сортирует, пишет в файл, но с ошибками. Иногда правильно
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.04.2010, 07:41     Чтение структуры из файла и запись нового #19
Цитата Сообщение от artem0n2
компилятору не нравится =( почему используется int cmpfunc для сортировки, если name у меня char?
а ты stdlib.h подключил ? я забыл написать
в кратце, qsort() выполняет сортировку, она может сортировать что угодно, так как является функцией общего назначения; чтобы отсортировать структуры, нам нужно подать в qsort() массив структур и функцию, с помощью которой qsort() сможет определять, какие структуры менять местами, а какие оставлять; вот cmpfunc() - как раз такая функция, она заходит в обе структуры и сравнивает имена в них (имена она сравнивает с помощью strcmp() из string.h)
допустим, если бы у тебя был массив имён, мы могли бы применить qsort(массив_имён, количество_имён, размер_одного_имени, strcmp); потому что здесь нет массива структур и нам не нужно заходить в структуры, чтобы сравнить имена, но и переставлять нам бы пришлось только имена (со структурами же переставляются структуры, то есть и имена, и всё остальное)

Добавлено через 16 минут
Цитата Сообщение от artem0n2
сортирует, пишет в файл, но с ошибками. Иногда правильно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 (probel, buf); // это чтобы записывать в блокноте людей через одну пустую строку.   
                i++;
        }
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    char buf[1000], *bufptr;
    int retval;
 
    while ((bufptr = fgets(buf, sizeof buf, base)) != NULL) {
        
        retval = sscanf(
            bufptr,
            "%99[^\n]%49[^\n]%49[^\n]",
            info[i].name, info[i].rabota.AS, info[i].rabota.Tel
        );
 
        if (retval != 3) {
            fprintf(stderr, "error: read data" "\n");
            return 1;
        }
 
        /* здесь можно вывести данные */
 
        i++;
 
    }
про пробел неясно
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
13.04.2010, 10:11  [ТС]     Чтение структуры из файла и запись нового #20
C++
1
2
fgets (buf, 100, base);
strcpy (info[i].probel, buf);
это не пробел, это новая строка) добавил чтоб был не сплошной текст в первом файле
ваш вариант ввода данных сложнее какую часть программы мне нужно исправить? просто например если в исходном файле есть список людей с разными профессиями, программа странным образом успешно сортирует только по одной профессии, а если делать запрос по другой профессии, то выводит весь список людей упорядоченный по именам. я хз
accept
4821 / 3241 / 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
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,276
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
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,276
13.04.2010, 12:07     Чтение структуры из файла и запись нового #24
Выводит на экран содержимое файла, и мы видим что именно мы хотим записать в файл
Миниатюры
Чтение структуры из файла и запись нового  
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,276
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
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,276
13.04.2010, 23:25     Чтение структуры из файла и запись нового #27
если Visual C++ то system("cls"); но оно, мне кажется, не нужно вначале программы, у меня просто BCPP 3.1 так там экран не очищается после окончания работы программы, вот я и написал по привычке, думаю, можно удалить)
с сортировкой разобрались? там нужно посимвольно сравнивать, ато strcmp(); сравнивает длины строк, а не то, что вы хотели, насколько я понял
accept
4821 / 3241 / 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()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2010, 23:15     Чтение структуры из файла и запись нового
Еще ссылки по теме:
Ansi c, запись и чтение структуры из файла. Накосячил от души C++
Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод) C++
Чтение/запись структуры "Клиент" из текстового файла C++
Чтение текстового документа, обработка, запись нового C++
Чтение/запись структуры C++

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

Или воспользуйтесь поиском по форуму:
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,276
14.04.2010, 23:15     Чтение структуры из файла и запись нового #30
я же говорю, долой clrscr();
либо system("cls"); либо удалить его вообще)
Yandex
Объявления
14.04.2010, 23:15     Чтение структуры из файла и запись нового
Ответ Создать тему
Опции темы

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