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

Проверка на окончание файла

07.06.2016, 19:10. Показов 1417. Ответов 4
Метки нет (Все метки)

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
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#include <iostream>
#include <fstream>
#include <typeinfo>
#include <cstdlib>
using namespace std;
 
const int size = 100;
enum typeenum{ tmanager, tscientist, tlaborer };
///////////////////////////////////////////////////////////////////////////
class employe
{
protected:
    char name[ 10 ];
    int numb;
    static employe* array[ size ];
    static int n;
public:
    /*----------------------------------------------------------*/
    virtual void input( )
    {
        cin.ignore(10,'\n');
        cout<<"Введите имя: "; cin >> name;
        cout<<"Введите номер: "; cin >> numb;
    }
    /*----------------------------------------------------------*/
    virtual void output( )
    {
        cout << "Имя: " << name << endl;
        cout << "Номер: " << numb << endl;
    }
 
    virtual typeenum type_det( );
    static void add( );
    static void display( );
    static void writef( );
    static void readf( );
};
 employe* employe :: array[ size ];
int employe :: n = 0;
///////////////////////////////////////////////////////////////////////////
class manager : public employe
{
private:
    char title[ 20 ];
    double dues;
public:
    void input( )
    {
        employe :: input( );
        cout<<"Введите титул: "; cin >> title;
        cout<<"Введите налоги: "; cin >> dues;
    }
    void output( )
    {
        cout<<"------------------------------------------------------"<<endl;
        employe :: output( );
        cout<<"Титул: "<< title <<endl;
        cout<<"Налог: "<<dues <<endl;
        cout<<"------------------------------------------------------"<<endl;
    }
};
///////////////////////////////////////////////////////////////////////////
class scientist : public employe
{
private:
    int pubs;
public:
    void input( )
    {
        employe :: input( );
        cout<<"Введите число публикаций: "; cin >> pubs;
    }
    void  output( )
    {
        cout<<"------------------------------------------------------"<<endl;
        employe :: output( );
        cout<<"Публикаций: " << pubs <<endl;
        cout<<"------------------------------------------------------"<<endl;
    }
};
///////////////////////////////////////////////////////////////////////////
class laborer : public employe
{
public:
    void input( )
    { employe :: input( ); }
    void output( )
    {
        cout<<"------------------------------------------------------"<<endl;
        employe :: output( );
        cout<<"------------------------------------------------------"<<endl;
    }
};
///////////////////////////////////////////////////////////////////////////
 
   /*----------------------------------------------------------*/
    typeenum employe :: type_det( )
    {
        if( typeid(*this) == typeid(manager) )
        { return tmanager; }
        else if( typeid(*this)==typeid(scientist) )
        { return tscientist; }
        else if( typeid(*this)==typeid(laborer) )
        { return tlaborer; }
        else
        {cerr <<"Неправильный тип работника" <<endl; exit( 0 ); }
    }
    /*----------------------------------------------------------*/
    void employe :: add( )
    {
 
        char ch;
        cout << "m - добавить менеджера" << endl
             << "s - добавить ученого" << endl
             << "l - добавить рабочего" << endl
             << "Ваш выбор: "; cin >> ch;
        switch( ch )
        {
        case 'm': array[ n ] = new manager; break;
        case 's': array[ n ] = new scientist; break;
        case 'l': array[ n ] = new laborer; break;
        default: cout<<"Неизвестное значение"<<endl; exit( 1 );
        }
        array[ n++ ] -> input( );
    }
    /*----------------------------------------------------------*/
    void employe :: display( )
    {
 
        for( int i = 0; i < n; i++ )
        {
            switch( array[ i ] -> type_det( ) )
            {
            case tmanager: cout << "Менеджер: " <<endl; break;
            case tscientist: cout << "Ученый: " <<endl; break;
            case tlaborer: cout << "Рабочий: " <<endl; break;
            }
            array[ i ] -> output( );
        }
    }
    /*----------------------------------------------------------*/
    void employe :: writef( )
    {
 
        int ofsize;
        cout<<"Идет запись..."<<endl;
        ofstream file;
        typeenum type;
        file.open( "bigfile.dat", ios :: trunc | ios :: binary   );
        if( !file )
        { cout <<"Ошибка открытия файла! " <<endl; exit( 1 ); }
 
        for( int i = 0; i < n; i++ )
        {
            type = array[ i ] -> type_det( );
 
            file.write( (char*)&type, sizeof( type ) );
            switch( type )
            {
            case tmanager: ofsize = sizeof( manager ); break;
            case tscientist: ofsize = sizeof( scientist ); break;
            case tlaborer: ofsize = sizeof( laborer ); break;
            }
 
            file.write( (char*)(array[ i ]), ofsize );
 
            if( !file )
            { cout <<"Ошибка записи в файл! " <<endl; exit( 1 ); }
        }
        file.close( );
    }
    /*----------------------------------------------------------*/
    void employe :: readf( )
    {
 
        int ofsize;
        typeenum type;
        ifstream fileIN;
        fileIN.open( "bigfile.dat", ios :: binary );
        if( !fileIN )
        { cout <<"Ошибка открытия файла! " <<endl; exit( 1 ); }
 
        n = 0;
        while( true )
        {
           fileIN.read( (char*)&type, sizeof( type ) );
 
          if( fileIN.eof( ) )
          { break; }
 
           if( !fileIN )
           { cout<<"Ошибка чтения типа "<<endl; exit( 0 ); }
 
           switch( type )
           {
           case tmanager: array[ n ] = new manager; ofsize = sizeof( manager ); break;
           case tscientist: array[ n ] = new scientist; ofsize = sizeof( scientist ); break;
           case tlaborer: array[ n ] = new laborer; ofsize = sizeof( laborer ); break;
           }
           fileIN.read( (char*)array[ n ], ofsize );
           if( !fileIN )
           { cout<<"Ошибка чтения файла "<<endl; exit( 1 ); }
 
           n++;
 
        }
        cout<<"Идет чтение "<< n << " работников"<<endl;
        fileIN.close( );
    }
 
///////////////////////////////////////////////////////////////////////////
int main( )
{setlocale( LC_ALL,"rus" );
 
 
char ch;
while( true )
{
   cout << "a - добавить объект" << endl
        << "d - вывести на экран" << endl
        << "w - записать в файл" << endl
        << "r - прочитать из файла" << endl
        << "e - выход из программы" << endl
        << "Ваш выбор: "; cin >> ch;
   switch( ch )
   {
   case 'a' : employe :: add( ); break;
   case 'd' : employe :: display( ); break;
   case 'w' : employe :: writef( ); break;
   case 'r' : employe :: readf( ); break;
   case 'e' : cout << "Программа завершена"<<endl; exit( 1 ); break;
   default: cout << "Введено неверное значение"<<endl; exit( 1 );
   }
}
 
return 0;
}
Это рабочий код. Сюда записываются данные трех видов работников: Менеджер, Ученый, Рабочий с использованием метода полиморфизма. Данные сохраняются в массиве, затем объекты массива записываются в файл. При последующем запуске программы данные можно сохранить обратно в массив и вывести на экран. Вопрос вот в чем:
1) Строка 184 по 192. В 188 строке прописан код на проверку окончания файла, если файл заканчивается, то выходим из цикла. Я решил вместо if прописать условие в самом цикле: while( fileIN. eof( ) ) но с таким вариантом код работает некорректно. При попытке (после второго запуска программы) выгрузить данные из файла, срабатывает ошибка из 191 строки. Непонятно почему это происходит. Объясните, пожалуйста. В том виде, в котором код сейчас, все работает корректно.
2) Строка 32. Не понимаю, почему эта функция должна быть виртуальной? Ведь она не используется производными классами
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2016, 19:10
Ответы с готовыми решениями:

Окончание файла
Доброго вечера! В тхт файле всего одна строка из 12 символов- 12 байт. Пытаюсь ее прочитать но...

Неожиданное окончание файла
Требуется организовать побитовое чтение файла (формат .dat) и компоновка (перестановка 2-х бит) в...

Проверка на окончание лицензии
Имеется код procedure TForm3.Button8Click(Sender: TObject); var d:integer; good:boolean; begin...

Chromium Embedded, проверка на окончание загрузки страницы
Как в chromium сделать проверку на окончание загрузки страницы? Знаю что в стандартном браузере...

4
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
07.06.2016, 19:45 2
Цитата Сообщение от Eragorn2013 Посмотреть сообщение
Я решил вместо if прописать условие в самом цикле: while( fileIN. eof( ) ) но с таким вариантом код работает некорректно.
Потому что проверять надо после чтения, а не до. Уже много раз объясняли, что eof устанавливается только после попытки прочитать за последним байтом файла. Если в файле 10 байт и ты считываешь десятибайтный блок, eof не будет установлен, хотя больше и нет данных - так как попытки считать 11-й байт не было.
Цитата Сообщение от Eragorn2013 Посмотреть сообщение
почему эта функция должна быть виртуальной?
Чтобы тип определялся динамически.
0
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 11
07.06.2016, 20:35  [ТС] 3
Не совсем понял. Т.е. получается, что при последней итерации цикла из файла считается непонятно что, выходящее за размеры файла и тогда eof сработает?
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
07.06.2016, 21:46 4
Лучший ответ Сообщение было отмечено Eragorn2013 как решение

Решение

Цитата Сообщение от Eragorn2013 Посмотреть сообщение
Т.е. получается, что при последней итерации цикла из файла считается непонятно что, выходящее за размеры файла и тогда eof сработает?
Примерно так.
1
0 / 0 / 0
Регистрация: 01.04.2016
Сообщений: 11
07.06.2016, 23:32  [ТС] 5
Большое спасибо
0
07.06.2016, 23:32
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2016, 23:32
Помогаю со студенческими работами здесь

Отследить окончание скачивания файла DownloadFileAsync
Мне нужно скачать одну картинку. Но если использовать DownloadFile, то форма виснет. Мне этого не...

Как отловить окончание загрузки файла
Доброго времени суток, я хотел узнать как для данной функции отловить окончание загрузки файла,...

Определить окончание загрузки файла, и после удалить файл
Пользователь загужает файл, мне нужно определить момент конца загрузки файла, после чего файл...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
Объекты и их имена
hw_wired 28.01.2025
Введение: Основы объектного подхода и их роль в информатике В современном мире информационных технологий объектный подход стал фундаментальным принципом организации и обработки информации. Этот. . .
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru