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

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

14.10.2013, 22:31. Показов 1783. Ответов 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 2
C
1
2
3
void vvid(){...}
...
vvod();
работает?)

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

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

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

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

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

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


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Исследование байт-кода Python: подключаем дизассемблер
stackOverflow 19.02.2025
Многие знают, что Python - интерпретируемый язык, но мало кто задумывается о том, что происходит между написанием кода и его выполнением. На самом деле Python использует промежуточное представление. . .
Исследование байт-кода Python: компиляторы против интерпретаторов
stackOverflow 19.02.2025
Понимание байт-кода Python - основополагающий аспект для разработчиков, стремящихся глубже понять внутренние механизмы языка и оптимизировать производительность своих программ. Байт-код представляет. . .
Comprehensions в Python - что это такое?
stackOverflow 19.02.2025
Когда речь заходит о Python, одной из его самых красивых и мощных возможностей являются списковые включения или comprehensions. Это особые синтаксические конструкции, позволяющие создавать новые. . .
Python правда такой медленный? Развенчиваем миф о медлительности
stackOverflow 19.02.2025
Когда речь заходит о выборе языка программирования для нового проекта, вопрос производительности часто становится одним из ключевых факторов. Python, несмотря на свою популярность и простоту. . .
Динамические формы в Flask
stackOverflow 19.02.2025
Работа с веб-формами часто требует гибкости в отношении количества полей, которые пользователь может заполнить. Представьте ситуацию, когда вам нужно создать форму для ввода контактных данных, где у. . .
Обнаружение объектов в реальном времени на Raspberry Pi с OpenCV и Movidius NCS
stackOverflow 19.02.2025
Технология обнаружения объектов в реальном времени становится все более востребованной в различных областях - от систем безопасности до автономных транспортных средств. Особый интерес представляет. . .
где chromium хранит пароли и как их обнулить в пожарном варианте
jigi33 19.02.2025
Where is the chromium browser stores passwords for a sites где chromium-подобный браузер хранит пароли и как их обнулить в пожарном варианте (see screenshot)
howto get access to external internet resources with kinit
jigi33 19.02.2025
Решение проблемы с необходимостью доп. авторизации по Керберос для автоотработки аутентификации на прокси-сервер (see screenshot)
Отслеживание автомобилей и определение скорости с OpenCV и Python на Raspberry Pi
stackOverflow 19.02.2025
В этой статье мы рассмотрим создание системы отслеживания транспортных средств и определения их скорости с использованием компьютерного зрения и библиотеки OpenCV. Наше решение основано на принципе. . .
ENV (environments) valid paths in linux
jigi33 19.02.2025
Environments paths (see screenshot)
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru