Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
3 / 3 / 2
Регистрация: 30.09.2013
Сообщений: 32
1

Считать из файла структуру - Название книги, автор, категория

14.10.2013, 22:31. Показов 1752. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Мое задание заключается в написании программы, которая считывает из файла структуру (Название книги, автор, категория, к-во страниц, оценка, цена) либо позволяет ввести ее самой и сортирует ее по выбранному параметру. Все прекрасно работает, когда я ввожу структуру сама. А считать из файла у меня не удается. Не могу понять как работает.( Объясните, пожалуйста, что не так?
И при возможности посоветуйте как бы отдельно доступиться например к какому-то одному желаемому элементу, чтобы его изменить, если он уже считан или задан?
вот мой код:

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include<stdio.h>
#include<string.h>
#include<conio.h>
#define N 3
 
 
struct BOOKS
{
 char NAME[30];
 char AUTHOR[30];
 char CATEGORY[30];
 int STR;
 int BALL;
 int PRICE;
 }
 BOOK[N];
 
void vvid()
{
 int a,i,X;
 printf("S faila - 1; Vvestu samomy - 2\n");
 scanf("%d", &a);
 if (a==1)
 {
    FILE *fp;
    fp = fopen("books.txt", "rb");
    X = fread(&BOOK[0], sizeof(BOOK[N]), N, fp);
    fclose(fp); }
 else
 {
   for (i=0; i<N; i++)
   {
    printf("Vvedite dannue %d knuhu\n", i+1);
    printf("Nazva: ");
    scanf("%s", BOOK[i].NAME);
 
    printf("Avtor: ");
    scanf("%s", BOOK[i].AUTHOR);
 
    printf("Katehoria: ");
    scanf("%s", BOOK[i].CATEGORY);
 
    printf("Stranic: \n");
    scanf("%d", &BOOK[i].STR);
 
    printf("Ocenka: \n");
    scanf("%d", &BOOK[i].BALL);
 
    printf("Cena: \n");
    scanf("%d", &BOOK[i].PRICE);
    }}}
 
void printrezult()
{
 int z,m;
  for(z=0;z<N;z++)
  {
   printf("%20s %-10s %-10s %-5d %-5d %-5d\n",BOOK[z].NAME,BOOK[z].AUTHOR,BOOK[z].CATEGORY,BOOK[z].STR,BOOK[z].BALL,BOOK[z].PRICE);
  }
}
 
void sort()
{
 int j,k,x,y,v,w,s,z,d,g,h,u,b;
 printf("sort author - 1; sort title - 2; sort category - 3;\n");
 printf("sort pages - 4; sort mark - 5; sort price - 6.\n");
 scanf("%d",&b);
 BOOKS p;
 
    if (b==1) {
        for(j=0; j<N; j++)
        {
          for(k=0; k<N; k++)
          {
            if(strcmp(BOOK[j].NAME,BOOK[k].NAME)<0)
            {
              p=BOOK[j];
              BOOK[j]=BOOK[k];
              BOOK[k]=p; }
              }}}
    if (b==2) {
        for(x=0; x<N; x++)
        {
          for(y=0; y<N; y++)
          {
            if(strcmp(BOOK[x].AUTHOR,BOOK[y].AUTHOR)<0)
            {
              p=BOOK[x];
              BOOK[x]=BOOK[y];
              BOOK[y]=p; }
              }}}
    if (b==3) {
        for(v=0; v<N; v++)
        {
          for(w=0; w<N; w++)
          {
            if(strcmp(BOOK[v].CATEGORY,BOOK[w].CATEGORY)<0)
            {
               p=BOOK[v];
               BOOK[v]=BOOK[w];
               BOOK[w]=p; }
               }}}
     if (b==4) {
        for(s=0; s<N; s++)
        {
          for(z=0; z<N; z++)
          {
          if (BOOK[s].STR<BOOK[z].STR)
            {
               p=BOOK[s];
               BOOK[s]=BOOK[z];
               BOOK[z]=p; }
               }}}
     if (b==5) {
        for(d=0; d<N; d++)
        {
          for(g=0; g<N; g++)
          {
            if (BOOK[d].BALL<BOOK[g].BALL)
            {
               p=BOOK[d];
               BOOK[d]=BOOK[g];
               BOOK[g]=p; }
               }}}
       if (b==6) {
        for(h=0; h<N; h++)
        {
          for(u=0; u<N; u++)
          {
            if (BOOK[h].PRICE<BOOK[u].PRICE)
            {
               p=BOOK[h];
               BOOK[h]=BOOK[u];
               BOOK[u]=p; }
               }}}
}
 
void main()
{
 clrscr();
 vvod();
 printf("Do :\n");
 printrezult();
 sort();
 printf("posle :\n");
 printrezult();
 getch();
}
Считываю я такое:
Heaven_Has_No_Favorites Remarque a 413 9 45
Blow_sword Balfour c 685 10 56
Great_expectations ****ens a 1003 10 60


заранее огромное Спасибо!)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2013, 22:31
Ответы с готовыми решениями:

Считать структуру с файла
КАа считать структуру с файла?Текстовый или бинарный без разницы Структура такая struct...

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

Описать структуру Bibliotec, содержащую следующие поля: автор книги, инвентарный номер книги, название книги
Описать структуру BIBLIOTEC содержащий следующие поля: автор книги , инвентарный номер книги ,...

Опишите, используя структуру записи, книги(автор,название,год издания).Составьте программу вывода на экран упорядоченного списка книг(по фамилии автор
Опишите, используя структуру записи, книги(автор,название,год издания).Составьте программу вывода...

7
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
14.10.2013, 22:39 2
C
1
2
3
void vvid(){...}
...
vvod();
работает?)

Цитата Сообщение от AnSm Посмотреть сообщение
Считываю я такое:
а как правильно должен выглядеть вывод?
0
3 / 3 / 2
Регистрация: 30.09.2013
Сообщений: 32
14.10.2013, 22:50  [ТС] 3
Вывод должен выглядеть как таблица. Можно так же, как написано в файле. Каждая книжка с новой строки.

Я забыла исправить вверху на vvod) но в коде у меня все правильно и работает. Исправила, что бы вам понятней было, так как пишу названия транслитом на украинском)
0
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
14.10.2013, 22:59 4
Цитата Сообщение от AnSm Посмотреть сообщение
Каждая книжка с новой строки.
на данный момент это правило выполняется.

Цитата Сообщение от AnSm Посмотреть сообщение
Вывод должен выглядеть как таблица.
т.е. по сути вы хотите выровнять все по столбцам? Что конкретно сейчас не устраивает?

Добавлено через 2 минуты
кстати, используемое Вами форматирование текста обычно используется в семействе языков Lisp, в си его избегают.
0
3 / 3 / 2
Регистрация: 30.09.2013
Сообщений: 32
14.10.2013, 23:06  [ТС] 5
Программа не правильно считывает информацию из файла. Заруньте ее и нажмите 1, когда она спрашивает читать из файла или ввести самому. Может это только у меня ерунда какая-то, вместо трех строчек. Если что - я в борланде сижу))

Добавлено через 2 минуты
я не знаю про семейства языков Lisp(
все что умею - училась по книжке.
0
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
14.10.2013, 23:25 6
У меня так:
Код
$ gcc49 -Wall test8.c
test8.c: In function 'vvid':
test8.c:17:13: warning: variable 'X' set but not used [-Wunused-but-set-variable]
     int a,i,X;
             ^
test8.c: In function 'printrezult':
test8.c:46:11: warning: unused variable 'm' [-Wunused-variable]
     int z,m;
           ^
test8.c: At top level:
test8.c:127:14: warning: return type of 'main' is not 'int' [-Wmain]
         void main()
              ^
$ cat books.txt 
Heaven_Has_No_Favorites Remarque a 413 9 45
Blow_sword Balfour c 685 10 56
Great_expectations ****ens a 1003 10 60
$ ./a.out
S faila - 1; Vvestu samomy - 2
1
Do :
Heaven_Has_No_Favorites Remarque a 413 9 45
Blow_sword Balfour c 685 10 56
Great_expectations ****ens a 1003 10 60
 ue a 413 9 45
Blow_sword Balfour c 685 10 56
Great_expectations ****ens a 1003 10 60
 ur c 685 10 56
Great_expectations ****ens a 1003 10 60
 1766072435 1852140387 543236211
                             1003 10 60
                       0     0     0    
                                                               0     0     0    
sort author - 1; sort title - 2; sort category - 3;
sort pages - 4; sort mark - 5; sort price - 6.
^C
$
Т.е. считывает как раз правильно, проблемы идут уже после.

Но ковыряться в таком
C
1
int j,k,x,y,v,w,s,z,d,g,h,u,b;
можно только на свежую голову)
0
3 / 3 / 2
Регистрация: 30.09.2013
Сообщений: 32
14.10.2013, 23:50  [ТС] 7
int j,k,x,y,v,w,s,z,d,g,h,u,b; - не пугайтесь этой строки)) Программа адекватно работает, если я сама ввожу с клавиатуры данные. Проблема в считывании из файла.

Добавлено через 11 минут
Вы можете сами в этом убедиться, если введете данные с клавиатуры, после этого выберете по чем сортировать и увидите результаты.
0
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
15.10.2013, 08:47 8
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

а все равно надо на свежую голову думать)

Цитата Сообщение от AnSm Посмотреть сообщение
не пугайтесь этой строки))
в этой функции реально нужны 3 переменные, а не 13! b - для типа сортировки и еще 2 индекса, которые не зависят от выбора сортировки.

По существу.
Проблема у вас тут:
C
1
X = fread(&BOOK[0], sizeof(BOOK[N]), N, fp);
fread считывает N байт, которые кладет в BOOK сплошным потоком байт, не заморачиваясь с полями стрктуры. В итоге все содержимое файла попадает в BOOK[0].NAME ... BOOK[0].CATEGORY. В оставшихся полях BOOK[0] и в 2 других структурах продолжает валяться мусор.
Вам нужно форматированное чтение через fscanf()

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N 3
 
typedef struct
{
    char NAME[30];
    char AUTHOR[30];
    char CATEGORY[30];
    int STR;
    int BALL;
    int PRICE;
} BOOKS, *p_BOOKS;
BOOKS BOOK[N];
 
void vvid()
{
    int a,i;
    printf("S faila - 1; Vvestu samomy - 2\n");
    scanf("%d", &a);
    if (a==1)
    {
        FILE *fp;
        fp = fopen("books.txt", "rb");
        if(!fp)
        {
            fputs("Error: cannot open file books.txt\n", stdout);
            fputs("Error: cannot open file books.txt\n", stderr);
            exit(1);
        }
        for(i = 0; i < N; ++i)
        {
            fscanf(fp, "%s", BOOK[i].NAME);
            fscanf(fp, "%s", BOOK[i].AUTHOR);
            fscanf(fp, "%s", BOOK[i].CATEGORY);
            fscanf(fp, "%d", &BOOK[i].STR);
            fscanf(fp, "%d", &BOOK[i].BALL);
            fscanf(fp, "%d", &BOOK[i].PRICE);
        }
        fclose(fp);
    }
    else
    {
        for (i=0; i<N; i++)
        {
            printf("Vvedite dannue %d knuhu\n", i+1);
            printf("Nazva: ");
            scanf("%s", BOOK[i].NAME);
            printf("Avtor: ");
            scanf("%s", BOOK[i].AUTHOR);
            printf("Katehoria: ");
            scanf("%s", BOOK[i].CATEGORY);
            printf("Stranic: \n");
            scanf("%d", &BOOK[i].STR);
            printf("Ocenka: \n");
            scanf("%d", &BOOK[i].BALL);
            printf("Cena: \n");
            scanf("%d", &BOOK[i].PRICE);
        }
    }
}
 
void printrezult()
{
    int z;
    for(z=0;z<N;z++)
    {
        printf("%30s %-10s %-10s %-5d %-5d %-5d\n",BOOK[z].NAME,BOOK[z].AUTHOR,BOOK[z].CATEGORY,BOOK[z].STR,BOOK[z].BALL,BOOK[z].PRICE);
    }
}
 
void sort()
{
    int j,k,x,y,v,w,s,z,d,g,h,u,b;
    printf("sort author - 1; sort title - 2; sort category - 3;\n");
    printf("sort pages - 4; sort mark - 5; sort price - 6.\n");
    scanf("%d",&b);
    BOOKS p;
    if (b==1)
    {
        for(j=0; j<N; j++)
        {
            for(k=0; k<N; k++)
            {
                if(strcmp(BOOK[j].NAME,BOOK[k].NAME)<0)
                {
                    p=BOOK[j];
                    BOOK[j]=BOOK[k];
                    BOOK[k]=p;
                }
            }
        }
    }
    if (b==2) {
        for(x=0; x<N; x++)
        {
            for(y=0; y<N; y++)
            {
                if(strcmp(BOOK[x].AUTHOR,BOOK[y].AUTHOR)<0)
                {
                    p=BOOK[x];
                    BOOK[x]=BOOK[y];
                    BOOK[y]=p;
                }
            }
        }
    }
    if (b==3) {
        for(v=0; v<N; v++)
        {
            for(w=0; w<N; w++)
            {
                if(strcmp(BOOK[v].CATEGORY,BOOK[w].CATEGORY)<0)
                {
                    p=BOOK[v];
                    BOOK[v]=BOOK[w];
                    BOOK[w]=p;
                }
            }
        }
        if (b==4) {
            for(s=0; s<N; s++)
            {
                for(z=0; z<N; z++)
                {
                    if (BOOK[s].STR<BOOK[z].STR)
                    {
                        p=BOOK[s];
                        BOOK[s]=BOOK[z];
                        BOOK[z]=p;
                    }
                }
            }
        }
        if (b==5) {
            for(d=0; d<N; d++)
            {
                for(g=0; g<N; g++)
                {
                    if (BOOK[d].BALL<BOOK[g].BALL)
                    {
                        p=BOOK[d];
                        BOOK[d]=BOOK[g];
                        BOOK[g]=p;
                    }
                }
            }
        }
        if (b==6) {
            for(h=0; h<N; h++)
            {
                for(u=0; u<N; u++)
                {
                    if (BOOK[h].PRICE<BOOK[u].PRICE)
                    {
                        p=BOOK[h];
                        BOOK[h]=BOOK[u];
                        BOOK[u]=p;
                    }
                }
            }
        }
    }
}
 
int main(void)
{
    vvid();
    printf("Do :\n");
    printrezult();
    sort();
    printf("posle :\n");
    printrezult();
    return 0;
}
1
15.10.2013, 08:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2013, 08:47
Помогаю со студенческими работами здесь

Разработать базу данных «Научно-техническая библиотека» (фамилия, имя, отечество, автор книги, название книги, город и издательство, год выпуска, тема
что то никак понять не могу(( Разработать базу данных «Научно-техническая библиотека» (фамилия,...

Создать библиотеку в которой есть название книги, год издания и автор
Создать библиотеку в которой есть название книги , год издания и автор . В ней должно быть...

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

Записи и типизированные файлы. Структура: автор книги, название, год издания
Пожалуйста срочно нужно Создать файл, содержащий сведения о личной коллекции книголюба. Структура...


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

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