Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.05.2013
Сообщений: 29
1

Перестановка первого и последнего элементов структуры

14.05.2015, 00:56. Показов 1146. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

Как у знающих людей, прошу помощи.

Вот задание:
Создать класс для работы с файлами. В классе реализовать функцию замены местами в бинарном файле, содержащем структуры (несколько полей) первого и последнего элементов (структур). Для работы с файлами использовать классы ifstream, ofstream, fstream.

Написать основной код, я написала, а вот с перестановкой возникли проблемы
Может кто поможет исправить функцию Change()?

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
#include "stdafx.h"
#include  <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <iomanip>
 
using namespace std;
 
struct Friends
{
    char lname[20];
    char fname[20];
    char bday[20];
} obj_fr;
 
class File
{
    char filename[20];
    fstream *strm, *nstrm;//
    int k;
public:
    
    File(char *filename);
    ~File();
    int Open();
    const char *Getname();
    int Read(Friends &);
    void Remote();
    void Add(Friends);
    int Getcount();
    void Change();
};
 
ostream& operator << (ostream &out, File &obj)
{
    Friends fr;
    out << "\nFile " << obj.Getname() << endl;
    out << "Last name " << setw(15) << "First name" << setw(15) << "Birthday\n";
    obj.Remote();
    while (obj.Read(fr))
    out << fr.lname << setw(15) << fr.fname << setw(15) << fr.bday << "\n";
    return out;
 
}
 
File::File(char *_fname)
{
    strncpy(filename, _fname, 20);
    strm = new fstream();
    nstrm = new fstream(); //
 
}
File::~File()
{
    strm -> close();
    delete strm;
 
    nstrm -> close();//
    delete nstrm;//
}
 
int File::Open()
{
    strm -> open(filename,ios::in|ios::out|ios::binary|ios::trunc);
    if(!strm -> is_open()) return -1;
    return 0;
}
int File::Read(Friends &fr)
{
    if (!strm -> eof() && strm -> read(reinterpret_cast<char*>(&fr), sizeof (Friends)))
    return 1;
    strm -> clear();
    return 0;
}
 
void File::Remote()
{
    strm -> seekg(0, ios_base::beg);
    strm -> seekp(0, ios_base::beg);
    strm -> clear();
}
 
const char* File::Getname()
{
    return this-> filename;
}
void File::Add(Friends obj_fr)
{
    strm -> seekp(0, ios_base::end);
    strm -> write(reinterpret_cast<char*>(&obj_fr), sizeof(Friends));
    strm -> flush();
}
 
int File::Getcount()
{
    Remote();
    strm -> seekp(0, ios_base::end);
    k = strm -> tellp();
    k /= sizeof(Friends);
    return k;
}
 
void File::Change()
{
    int num = Getcount();
    int first, last, i;
    first = 0;
    last = 0;
    i = 0;
    Friends first_fr, last_fr, fr;
 
    while (strm -> eof())
    {
        if (i + 1 == num)
            last = strm -> tellp();
        if (i + 1 == 1)
            first = strm -> tellp();
        strm -> read(reinterpret_cast<char*>(&fr),sizeof(Friends));  
 
        if (strm -> eof()) break;
        i++;
 
        if (i == num)
            last_fr = fr;
        
        if (i == 1)
            first_fr = fr;
    
    }
    strm -> close();
    nstrm -> open(filename,ios::in|ios::out|ios::binary|ios::trunc);
    nstrm -> seekp(first); 
    nstrm -> write(reinterpret_cast<char*>(&last_fr),sizeof(Friends));  
 
    nstrm -> seekp(last);
    nstrm -> write(reinterpret_cast<char*>(&first_fr),sizeof(Friends));
    nstrm -> close();
    strm -> open(filename,ios::in|ios::out|ios::binary|ios::trunc);
}
int main(void)
{
    File my("friends.bin");
    char ch = 'y';
 
    if (my.Open() == -1)
    {
        cout << "Can't open file\n";
        return -1;
    }
 
    do
    {
        cout << "Enter last name: ";
        cin >> obj_fr.lname;
        cout << "Enter first name: ";
        cin >> obj_fr.fname;
        cout << "Enter birthday: ";
        cin >> obj_fr.bday;
        my.Add(obj_fr);        
        cout << "Push 'Y' to enter next element.\n";
        cin >> ch;
    }while (ch == 'y');
 
    cout << my << endl;
    my.Change();//
    cout << my << endl;//
    getch();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2015, 00:56
Ответы с готовыми решениями:

Перестановка в строке первого и последнего слова..
Всем доброго времени суток!! Появилось вот такое задание написать программу на языке C++...

Перестановка местами первого и последнего элементов динамического списка
есть программа, нужно поменять местами первую и последнюю строчку этой структуры. Подскажите как...

Перестановка первого и последнего столбца матрицы
Есть матрица 3х4 и нужно поменять первый и последний столбец местами через VBA. Может кто нибудь...

Сортировка массива: перестановка минимального и первого элементов
Написал программу сортировки массива путём нахождения минимального элемента в массиве и...

1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
14.05.2015, 03:24 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void File::Change()
{
    int num = Getcount();
    
    Friends first_fr, last_fr;
 
    strm ->seekg(0);
    strm ->read(reinterpret_cast<char*>(&first_fr), sizeof(Friends));
    strm ->seekg((num - 2) * sizeof(Friends), ios::cur);
    strm ->read(reinterpret_cast<char*>(&last_fr), sizeof(Friends));
    
    strm ->seekp(0);
    strm -> write(reinterpret_cast<char*>(&last_fr), sizeof(Friends)); 
    strm ->seekg((num - 2) * sizeof(Friends), ios::cur);
    strm -> write(reinterpret_cast<char*>(&first_fr),sizeof(Friends));
 
    strm -> close();
}
1
14.05.2015, 03:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2015, 03:24
Помогаю со студенческими работами здесь

Определить в массиве количество элементов, равных полусумме первого и последнего элементов
Определить в массиве количество элементов , равных полусумме первого и последнего элементов. На СИ

Определить в массиве количество элементов равных полусумме первого и последнего элементов
определить в массиве количество элементов равных полусумме первого и последнего элементов.

Найти сумму первого,последнего и центрального элементов массива из 20 элементов.
Дан массив из 20 чисел мо знаком. Найти сумму первого,последнего и центрального элементов массива....

Найти количество элементов массива, равных среднему арифметическому первого и последнего элементов
Найти количество элементов массива, равных среднему арифметическому первого и последнего элементов...


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

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