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

Сформировать двоичный файл из элементов, заданной структуры "Абитуриент" - C++

Восстановить пароль Регистрация
 
AntipkA
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 8
21.05.2014, 08:23     Сформировать двоичный файл из элементов, заданной структуры "Абитуриент" #1
Помогите найти ошибку!
само условие : Сформировать двоичный файл из элементов, заданной в варианте структуры, распечатать его содержимое, выполнить удаление и добавление элементов в соответствии со своим вариантом, используя для поиска удаляемых или добавляе-мых элементов функцию. Формирование, печать, добавление и удаление элементов оформить в виде функций. Преду-смотреть сообщения об ошибках при открытии файла и вы-полнении операций ввода/вывода.
3. Варианты
1. Структура "Абитуриент":
- фамилия, имя, отчество;
- год рождения;
- оценки вступительных экзаменов (3);
- средний балл аттестата.

Добавлено через 3 минуты
Решил разбить задачу на под задачи. пытаюсь воспроизвести ввод данных в файл и вывод
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
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <ctime>
#include <cstdio>
using namespace std;
 
struct abiturient
{
    char fio [35];
    char b_year[4];
    char ocenki[3];
    int sr_bal ;
};
 
int main ()
{
    abiturient st;
    FILE *f;
    setlocale (LC_ALL, "RUS");
int n;
f=fopen("f.txt", "wb");
cout << "Введите данные абитуриента"; 
fwrite(&n, sizeof(n), 1, f);
 
cout << "\n Имя, Фамилия: "; cin >> st.fio ;
cout << endl;
cout << "\n Год рождения: "; cin >> st.b_year ;
cout << endl;
cout << "\n Оценка экзамена: "; cin >> st.ocenki ;
cout << endl;
cout << "\n Средний бал: "; cin >> st.sr_bal ;
cout << endl;
 
fwrite(&st, sizeof(st), 1, f);
fclose(f);
 
f=fopen("f.txt", "rb");
 
fread(&st, sizeof(st ), 1, f);
 cout << "\n Имя, Фамилия: " << st.fio ;
cout << "\n Год рождения: " << st.b_year ;
cout << endl << "\n Оценка экзамена: " << st.ocenki ;
cout << "\n Средний бал: " << st.sr_bal << endl ;
fclose(f);
 
_getch ();
return 0;
 
}
но почему то при выводе, не корректно выводит все кроме имени []http://cs617931.vk.me/v617931014/9074/hvlgeKzSjc4.jpg[/]
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2014, 08:23     Сформировать двоичный файл из элементов, заданной структуры "Абитуриент"
Посмотрите здесь:

В файл с помощью структуры записать следующие данные: "название папки, ее размер, дата создания" C++
C++ Сформировать двоичный файл из элементов, заданной в варианте структуры. Структура "Стадион"
Структура "Абитуриент": C++
Сформировать двоичный файл из элементов, заданных в варианте структур C++
Сформировать двоичный файл из элементов, заданных в варианте структуры. Структура "Человек" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
21.05.2014, 08:45     Сформировать двоичный файл из элементов, заданной структуры "Абитуриент" #2
вместо cin >> st.fio
используйте
C++
1
cin.getline(st.fio,35);
и все остальные текстовые переменные аналогично.
А для int
C++
1
(cin >> st.sr_bal).get();// дабы пропустить знак конца строки
Евгений Буланов
6 / 6 / 4
Регистрация: 23.10.2013
Сообщений: 63
21.05.2014, 08:55     Сформировать двоичный файл из элементов, заданной структуры "Абитуриент" #3
fread(&st, sizeof(st ), 1, f); Вы читаете с начала файла, а там в начале лежит "int n"
AntipkA
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 8
21.05.2014, 09:11  [ТС]     Сформировать двоичный файл из элементов, заданной структуры "Абитуриент" #4
Спасибо!
Изменил строки №11 ;28; 40 :
C++
1
2
3
int b_year; //11
cout << "\n Год рождения: "; (cin >> st.b_year).get();   //28
fread(&n, sizeof(n ), 1, f);   //40
вывод получился правильным. Далее попробую на основе этого создать функции ввода/вывода.
QuciKimpulse
0 / 0 / 0
Регистрация: 01.02.2015
Сообщений: 1
01.02.2015, 15:46     Сформировать двоичный файл из элементов, заданной структуры "Абитуриент" #5
AntipkA, Так вы решили эту задачу? не могли бы скинуть полный код.
ka_chu
 Аватар для ka_chu
2 / 2 / 3
Регистрация: 05.05.2015
Сообщений: 26
20.09.2015, 15:19     Сформировать двоичный файл из элементов, заданной структуры "Абитуриент" #6
Добрый день! Та же задача. Решаю по-своему, но в конце неодекватный результат. Когда я из уже записанного файла достаю информацию, чтобы посмотреть всё ли впорядке. Записываю её в новый массив структур rmas и распечатываю его содержимое. В итоге значения на экране появляются, как будто массив не заполнился правильно из файла. Неадекватные цифры и строки.
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
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#define _CRT_SECURE_NO_WARNINGS
 
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <cstring>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    typedef struct {
        char familyname[30];
        char name[30];
        char fathername[30];
        int date;
        int marks[3];
        float avermark;
    }enrollee;
 
    FILE *f;
    enrollee man;
    enrollee mas[10];
 
    if ((f = fopen("enrollee.dat", "wb")) == NULL) exit(1);
    
    for (int i = 0; i < 5; i++){
        printf("New enrollee %d\n", i);
        printf("Familyname = ");  scanf("%s", &man.familyname);
        printf("Name = ");        scanf("%s", &man.name);
        printf("Fathername = ");  scanf("%s", &man.fathername);
        printf("date = ");        scanf("%d", &man.date);
        printf("marks (separated by spaces) = ");  scanf("%d %d %d", &man.marks[0], &man.marks[1], &man.marks[2]);
        printf("Average mark in school-leaving certificate = ");  scanf("%f", &man.avermark);
 
        fwrite(&man, sizeof(enrollee), 1, f);
        if (ferror(f) != NULL) exit(2);
    }
    fclose(f);
 
    if ((f = fopen("enrollee.dat", "rb")) == NULL) exit(3);
 
    int i = 0;
    while (!feof(f) && i < 5)
    {
        fread(&mas[i], sizeof(enrollee), 1, f);
        i++;
    }
    fclose(f);
 
    for (int i = 0; i < 5; i++){
        printf("\nNew enrollee %d\n", i);
        printf("Familyname = %s\n", mas[i].familyname);
        printf("Name = %s\n", mas[i].name);
        printf("Fathername = %s\n", mas[i].fathername);
        printf("date = %d\n", mas[i].date);
        printf("marks  = %d %d %d\n", mas[i].marks[0], mas[i].marks[1], mas[i].marks[2]);
        printf("Average mark in school-leaving certificate = %f\n", mas[i].avermark);
    }
 
    int numdel;
    printf("Input number of enrollee you want to delete. From 1 to 5. "); scanf("%d", &numdel);
    for (i = numdel - 1; i < 4; i++){
        mas[i] = mas[i + 1];
    }
 
    char familyadd[30];
    enrollee masnew[10];
    bool familyfound = false, familyinserted = false;
 
    printf("Input family name of enrollee after wich you want to add new one. "); scanf("%s", &familyadd);
 
    if ((f = fopen("enrollee.dat", "wb")) == NULL) exit(4);
 
    int j = 0;
    for (i = 0; i < 5; i++) {
        man = mas[i];
        if ((strcmp(mas[i].familyname, familyadd) == 0) && !familyfound) {
            familyfound = true;
            man = mas[j];
            j++;
        }
        else {
            if (familyfound && !familyinserted) {
                printf("i = %d\n", i);
                printf("Familyname = ");  scanf("%s", &man.familyname);
                printf("Name = ");        scanf("%s", &man.name);
                printf("Fathername = ");  scanf("%s", &man.fathername);
                printf("date = ");        scanf("%d", &man.date);
                printf("marks (separated by spaces) = ");
                scanf("%d %d %d", &man.marks[0], &man.marks[1], &man.marks[2]);
                printf("Average mark in school-leaving certificate = ");
                scanf("%f", &man.avermark);
                familyinserted = true;
            }
            else { man = mas[j]; j++; }
        }
        fwrite(&man, sizeof(enrollee), 1, f);
        if (ferror(f) != NULL) exit(5);
    }
    fclose(f);
 
    enrollee rmas[10];
    i = 0;
    while (!feof(f) && i < 5)
    {
        fread(&rmas[i], sizeof(enrollee), 1, f);
        i++;
    }
    fclose(f);
 
    for (int i = 0; i < 5; i++){
        printf("\nNew enrollee %d\n", i);
        printf("\nFamilyname = %s\n", rmas[i].familyname);
        printf("Name = %s\n", rmas[i].name);
        printf("Fathername = %s\n", rmas[i].fathername);
        printf("date = %d\n", rmas[i].date);
        printf("marks  = %d %d %d\n", rmas[i].marks[0], rmas[i].marks[1], rmas[i].marks[2]);
        printf("Average mark in school-leaving certificate = %f\n", rmas[i].avermark);
    }
    system("pause");
    return 0;
}
Добавлено через 36 минут
Всё вроде нашел. Глупая ошибка. Забыл в последний раз открыть файл перед чтением из него
Yandex
Объявления
20.09.2015, 15:19     Сформировать двоичный файл из элементов, заданной структуры "Абитуриент"
Ответ Создать тему
Опции темы

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