Аватар для AnSm
3 / 3 / 2
Регистрация: 30.09.2013
Сообщений: 32

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

14.10.2013, 22:31. Показов 1797. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2013, 22:31
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

Добавлено через 2 минуты
я не знаю про семейства языков Lisp(
все что умею - училась по книжке.
0
202 / 200 / 65
Регистрация: 06.10.2013
Сообщений: 552
14.10.2013, 23:25
У меня так:
Code
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
$ 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
 Аватар для AnSm
3 / 3 / 2
Регистрация: 30.09.2013
Сообщений: 32
14.10.2013, 23:50  [ТС]
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
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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

Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.10.2013, 08:47
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru