Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deicider
 Аватар для Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
06.04.2010, 16:44     Чтение структуры из файла и запись нового #2
Зачем так извращенно? сначала объявляешь одну структуру, потом вторую, в которой одна из переменных будет объектом первой структуры.
Далее вопрос уже к Вам: чтобы сказать, как правильно прочитать, сначала объясните, как вы в файл пишите?
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
06.04.2010, 16:59  [ТС]     Чтение структуры из файла и запись нового #3
как так сделать по отдельности но чтобы одна зависела от другой я не знаю, в задании также не уточнено как писать в файл, наверно можно по порядку типо:
Коля
Гасторбайтор
0302011

Вася
Рыболов
0203011
Deicider
 Аватар для Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
06.04.2010, 17:00     Чтение структуры из файла и запись нового #4
Ясно. Данные по человеку будут записаны в файле в три строки, каждая заканчивающася на \n. Первая строка – имя, вторая – место, третья – телефон. Писать в файл прямо строками функцией fputs. Потом читать из файла по строкам функцией fgets.

Тип переменной телефона тоже сделай строкой.
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
06.04.2010, 17:03  [ТС]     Чтение структуры из файла и запись нового #5
хорошо, чтото уже проясняется
Deicider
 Аватар для Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
06.04.2010, 17:13     Чтение структуры из файла и запись нового #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот код чтения. Сам не компилил, так что заранее извиняюсь, если где-то косяк будет какой-нибудь. Думаю, ход мысли будет понятен.

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
typedef struct
{ //структура для места работы этого человека
char AS[50]; //название места
char Tel[15]; //телефон
} mesto;
 
typedef struct
{
char name[100]; //имя человека
mesto rabota;
} chelovek;
 
main()
{
    char Asutus[50]; //то место работы которое вводится с клавиатуры и с ним идёт потом сравнение
    chelovek info[500];
    FILE *base;
    base=fopen("f1.txt","r");
    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, 15, base);
        strcpy (info[i].rabota.Tel, buf);
        
        i++;
    }
}
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
06.04.2010, 17:24  [ТС]     Чтение структуры из файла и запись нового #7
о спасибо большое, сколько не искал примеров, вы мне самый простой и понятный дали
теперь дело за сравнением и упорядочиванием, думаю справлюсь!
Deicider
 Аватар для Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
06.04.2010, 18:03     Чтение структуры из файла и запись нового #8
Да не за что )))

Кстати, я бы вообще не делал две структуры, а сделал бы одну. Не вижу реального смысла нагромождать отдельно место работы, если в программе не предполагается создание отдельных объектов этого типа.
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
06.04.2010, 18:17  [ТС]     Чтение структуры из файла и запись нового #9
я бы вообще всё что можно упростил, но по заданию надо сделать так
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
08.04.2010, 15:17  [ТС]     Чтение структуры из файла и запись нового #10
только почемуто это дело всё зависает) хотя код вроде без ошибок
Deicider
 Аватар для Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
08.04.2010, 16:25     Чтение структуры из файла и запись нового #11
Что значит зависает? Цикл, завязанный на условие feof, просто не может зациклиться навечно. Файл-то закончится рано или поздно. В цикле же ты не применяешь fseek, значит не должно зацикливаться.
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
08.04.2010, 22:21  [ТС]     Чтение структуры из файла и запись нового #12
что не так со сравнением блин?
C++
1
2
3
4
5
for(i=0; i>0; i++); {
                 int stricmp(const char *info[i].rabota.AS, const char *Asutus);
                 if(info[i].rabota.AS == Asutus);
                 printf("\n %s %d \n", info[i].name,info[i].rabota.Tel);
                 }
Добавлено через 8 минут
на счёт зависания, это я файл не в той папке создал =) мой косяк
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.04.2010, 06:14     Чтение структуры из файла и запись нового #13
Цитата Сообщение от Deicider
Цикл, завязанный на условие feof, просто не может зациклиться навечно. Файл-то закончится рано или поздно.
feof() проверяет флажок в структуре FILE
как меняется флажок

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
 
int main(void) /* ANSI C89 */
{
    FILE *ifp;
    int c;
    
    ifp = fopen("file.txt", "r");
    
    printf("0x%x" "\n", ifp->_flags);
    
    while ((c = getc(ifp)) != EOF)
        putchar(c);
 
    printf("0x%x" "\n", ifp->_flags);
    
    fclose(ifp);
    
    return EXIT_SUCCESS;
}

флажок может и не установиться
в его случае - ошибка открытия файла, а ещё может быть ошибка чтения файла
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
09.04.2010, 23:35  [ТС]     Чтение структуры из файла и запись нового #14
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
#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;
 
main()
{
        char Asutus[50];
        chelovek info[500];
        FILE *base;
        base=fopen("f1.txt","r");
        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);
        
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();
}
вот рабочий вариант, теперь надо где-то найти, как сделать упорядочивание по имени в алфавитном порядке, ещё не нашёл.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.04.2010, 10:28     Чтение структуры из файла и запись нового #15
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);
}
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
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
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
4838 / 3237 / 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++;
 
    }
про пробел неясно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2010, 10:11     Чтение структуры из файла и запись нового
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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);
это не пробел, это новая строка) добавил чтоб был не сплошной текст в первом файле
ваш вариант ввода данных сложнее какую часть программы мне нужно исправить? просто например если в исходном файле есть список людей с разными профессиями, программа странным образом успешно сортирует только по одной профессии, а если делать запрос по другой профессии, то выводит весь список людей упорядоченный по именам. я хз
Yandex
Объявления
13.04.2010, 10:11     Чтение структуры из файла и запись нового
Ответ Создать тему
Опции темы

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