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

Перегрузка оператора ++ , деструктор и конструктор копий - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Объект string! http://www.cyberforum.ru/cpp-beginners/thread156519.html
Нужно чтобы при вводе имени файла(даже с пробелами), или вообще других данных, они заносились в объект типа string! C помощью каких функций или операторов можно это сделать? Потому что если это делать с помощью объекта cin, то заносится не полное имя файла, если в нем были пробелы!!! Заранее благодарен! Вот пример кода: #include "stdafx.h" #include <iostream> #include <fstream> #include...
C++ Вопросы насчёт быстрой сортировки Здравствуйте. Объясните, пожалуйста. Есть алгоритм быстрой сортировки: Код: int shag=1; void quickSort(int arr, int left, int right, char v) { cout <<"--------" <<shag <<"-------" <<endl; if(v=='a') {cout <<" Вариант №1" <<endl; shag++;} http://www.cyberforum.ru/cpp-beginners/thread156477.html
C++ Измерение времени компиляции
как узнать время компиляции исходного текста и размер памяти, которую програма использует
C++ Запись пользовательского класса
Всем доброе время суток! Пишу класс шаблон, застрял на одном месте и не могу понять в чем проблема ... имеется пользовательский класс, в нем определена функция перегрузки оператора вставки в файл: ofstream& operator << (ofstream& s, user_type& ut) { s << ut.fstreet << " " << ut.fhouse; return s; } В классе шаблоне имеется функция записи элементов однонаправленного кольцевого списка в...
C++ Дереференс указателей http://www.cyberforum.ru/cpp-beginners/thread156432.html
после прочтения мануала появилась необходимость использовать beth = *ted; но оно выдает еррор C2100 =\ надо: есть size_t arg = 0x12345 нужно прочитать int по адресу из arg, можно ли это сделать поинтерами * или & ? или только кастом можно?
C++ ошибка с WINDOWS.H После подключения в одном из модулей модуля "afxwin.h" при компиляции появилась ошибка fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h> В чём ошибка? И как её устранить? подробнее

Показать сообщение отдельно
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
05.08.2010, 13:10  [ТС]     Перегрузка оператора ++ , деструктор и конструктор копий
Примет!

Собственно, я доделал примерно то, что хотел. И вот, что получилось:
File_pos.7z
file_pos.h
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
#include "io.h"
#include <fcntl.h>  /* _open() */
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include <iostream>
#include <new>
 
#define BUFF_SIZE   5
#define DEBUG_VER
 
typedef unsigned int  uint_t;      // 4 - bytes ; 0 to 4,294,967,295 
typedef std::string   str_t;
 
class File_pos
{
 
private:
    str_t   file_name;       /* Хранит имя файла */
    char *  buffer;          /* Указатель на массив  содержимого файла */
    uint_t  file_size;       /* Количество символов в файле*/
 
    uint_t  glob_pos;         /* Текущее полож. курсора, / 1 до file_size */
    uint_t  line;            /* текущая строка    / от 1 и до 4,294,967,295 */  
    uint_t  cursor;          /* позиция в строке  / от 1 и до 4,294,967,295 */
 
    uint_t  blocnum;         /* номер прочитанного блока */
    bool    eof;            /* Ни конец ли файла? */
   
 
    inline void get_file_size ();
    int read_buff ( char*& p_buf, uint_t bloc_num, uint_t buff_size/*, bool is_back*/ );
    
public :
 
    File_pos (const str_t filename );
    File_pos (const File_pos  &obj ); /* Конструктор копирования */
   ~File_pos ();
 
    File_pos operator++();
    File_pos operator--();
 
    void    set_new_file ( str_t f_name );
 
    uint_t  get_Line()      { return line; }
    uint_t  get_Cursor()    { return cursor; }
    
    char    get_Symb()      { return *buffer; } /*Текущий символ */
    
    bool    is_eof()        { return  eof; } 
    bool    is_begin()      { return ( glob_pos == 0 ); }
   
    void    Print();    
};

file_pos.cpp
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
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
#include "file_pos.h"
 
/* Конструктор */
File_pos::File_pos (const str_t filename )
{
    this->file_name = filename;
 
    this->get_file_size();  /* Инициализируем длину файла */
 
    this->blocnum   = 1;
    this->glob_pos  = 1;
 
    // Загружаем первый блок длиной BUFF_SIZE в память(buffer)
    read_buff ( this->buffer, this->blocnum, BUFF_SIZE );
 
    eof = file_size == 0;
    
    line    = 1;
    cursor  = 1;       
}
/*-----------------*/
 
/* Конструктор копирования */
File_pos::File_pos(const File_pos &obj)
{
    try 
    {        
        this->blocnum       = obj.blocnum;
        this->glob_pos      = obj.glob_pos;
        this->cursor        = obj.cursor;
        this->eof           = obj.eof;
        this->file_name     = obj.file_name ;
        this->file_size     = obj.file_size;
        this->line          = obj.line;        
 
        register size_t sz  = 0;
        this->buffer        = new char[ sz = strlen ( obj.buffer ) ];
    
        for (size_t i = 0; i < sz; ++i)
            this->buffer[i] = obj.buffer[i];
    }
    catch ( std::bad_alloc )
    {
        printf ( "error: in operator 'new' \n");
    }
    catch ( ... )
    {
        printf ( "error in copy constructor\n");
    }
}
 
/*-----Деструктор-----*/
File_pos::~File_pos()
{
    delete [] this->buffer;
 
/*#ifdef DEBUG_VER
    printf ("Destructor... \n" );
#endif*/ 
 
}
 
/*-- Определяет длину файла --*/
void
File_pos::get_file_size ()
{
    int fh;
 
    /* открываем файл для чтени в бинарном режиме */
    if ( (fh = _open( this->file_name.c_str(), _O_BINARY | O_RDONLY )) == -1)
    {
        perror("Open File...");
        return;
    }
 
    _lseek ( fh, 0L, SEEK_SET );  // Переводим курсор вначало файла   
 
    
    /* определяем количество символов в файле */
 
    if ( (this->file_size = _lseek ( fh, 0L, SEEK_END ) ) == 0 )    
        puts( "File is empty..." );        
    
    _close ( fh );
}
 
/*-------------------*/
 
 
// Читает "кусочек" данных в массив 
int
File_pos::read_buff ( char * & p_buf, uint_t bloc_num, uint_t buff_size )
{
 
#ifdef DEBUG_VER
    printf ( " .... read to buffer ....  \n" );
#endif
 
    int fh;
 
    if ( (fh = _open( this->file_name.c_str(), _O_BINARY | O_RDONLY )) == -1)
    {
        perror("Open File");
        return -1;
    }
 
    register size_t bufsz;
 
    /* Определяем необходимое количество выделяемой памяти bufsz */
    _lseek ( fh, (long) ( (bloc_num-1) * buff_size ) , SEEK_SET );
    bufsz = _lseek ( fh, 0L , SEEK_END );
 
    if ( bufsz >= buff_size )
        bufsz = buff_size;
        
    try
    {
        /* Выделяем память для элементов массива */
        p_buf = new char [ bufsz + 1 ] ;
        
    }catch ( std::bad_alloc &ba )
    {
        std::cout << ba.what() << " in func read_buff()  ...\n" ;
        return -2;
    }
 
    // переводим курсор на поз. начала чтения
    _lseek ( fh, (long) ( (bloc_num-1) * buff_size ) , SEEK_SET );
 
    
    register int rd_elem = 0;
    /* Считываем данные в массив p_buf и запоминаем */
    if ( ( rd_elem = _read ( fh, p_buf, bufsz ) ) == -1)
    {
        perror ( "reading problem..." );
        return -3;
    }
 
    *( p_buf + rd_elem ) = '\0';
 
    _close ( fh );
 
    return 0;
}
/*----------------------------*/
 
 
File_pos
File_pos::operator++ ()
{
    if ( glob_pos == file_size + 1 )
    {
        this->eof = true;
        return *this;
    }
   
    /* Определяем номера строки и курсор по текущему символу.*/    
    if ( this->get_Symb() == '\n')  /* тут можно поставить '\r' и тогда glob_pos + 2 */
    {
        ++line;
        cursor = 1;
    }
    else
    {
        ++cursor;
    }
    
 
    /* если достигли последнего элемента в буфере
       и есть еще что перезагрузить */
    if ( this->glob_pos == blocnum*BUFF_SIZE && file_size - glob_pos > 0)    
        read_buff ( this->buffer, ++blocnum, BUFF_SIZE );
 
 
    if ( this->glob_pos != (blocnum-1)*BUFF_SIZE )
        ++this->buffer;
 
    ++glob_pos;
    
    return *this;
}
/*----------------*/
 
 
File_pos
File_pos::operator-- ()
{
    /* Начинаем конструирование нового объекта 
    Поскольку, из текущего элемента никакой полезной инфо. нет
    потому, сразу переводим курсор на преыдущий символ     */
 
 
    /* Если находимся на границе блока то загружаем символы в массив*/
    if ( glob_pos == (blocnum-1)*BUFF_SIZE+1 && glob_pos != 1)
    {        
        read_buff ( this->buffer, --blocnum, BUFF_SIZE );
        buffer += BUFF_SIZE-1;        
    }
    else
    {
        --buffer;
    }
 
    --glob_pos; 
 
    /* Дальше формируем номера сроки и курсора */
 
    /*Если новый символ '\n' значит нужно подсчитать
      количество символов в предыдущей строке 
      Иначе просто уменьшаем позицию курсора*/
    if ( this->get_Symb() == '\n' )
    {
        /* Подсчитываем количество символов в предыдущей строке */
        --line;
        uint_t tmp_glob_pos  = this->glob_pos; // Позиция '\n'
        uint_t tmp_blnum    = this->blocnum;
 
        char * p_buf;
 
        /* Если находимся на границе блока то загружаем символы в массив*/
        if ( tmp_glob_pos == (blocnum-1)*BUFF_SIZE+1 )        
            read_buff ( p_buf, --tmp_blnum, BUFF_SIZE );
        else        
            p_buf = this->buffer-1;
        
 
        --tmp_glob_pos;
 
        /* Ищем позицию предыдущего символа '\n' */
        while ( *(p_buf) != '\n' &&  tmp_glob_pos >= 1 )
        {
            if ( tmp_glob_pos == (tmp_blnum-1)*BUFF_SIZE+1 && tmp_glob_pos != 1 )
            {
                read_buff ( p_buf, --tmp_blnum, BUFF_SIZE );
                p_buf += BUFF_SIZE-1;
                --tmp_glob_pos;
                continue;
            }
 
            --p_buf;
            --tmp_glob_pos;
        }
 
        /* Вычисляем длину предыдущей строки */
        cursor = this->glob_pos - tmp_glob_pos;       
    }
    else
    {
        --cursor;
    }
 
    return *this;
}
/*-------------------------*/
 
// Меняем исходный файл
void
File_pos::set_new_file ( str_t f_name )
{
    this->file_name = f_name;
    this->blocnum   = 1;
    
    this->get_file_size();
 
    read_buff ( this->buffer, this->blocnum, BUFF_SIZE );
    
    this->line      = 1;
    this->cursor    = 1;
    this->glob_pos   = 1;
    this->eof       = file_size == 0;    
}
/*----------------*/
 
/*--- Печатает текущий символ и его позицию ---*/
void
File_pos::Print()
{ 
    //printf ("На позиции %2.i ) -> " );
    switch ( this->get_Symb() )
    {
    case '\r' :
        printf ("Текущий символ \" \\r\" на позиции Ln (%3.i ) Cur (%3.i )", line, cursor);
        break;
    case '\n' :
        printf ("Текущий символ \" \\n\" на позиции Ln (%3.i ) Cur (%3.i )", line, cursor);
        break;
    case '\t' :
        printf ("Текущий символ \" \\t\" на позиции Ln (%3.i ) Cur (%3.i )", line, cursor);
        break;
    case '\0' :
        printf ("Текущий символ \"EOF\" на позиции Ln (%3.i ) Cur (%3.i )", line, cursor);
        break;
    default :
        printf ( "Текущий символ \" %-2c\" на позиции Ln (%3.i ) Cur (%3.i )",
                this->get_Symb(), line, cursor ); 
        break;
    }
    printf ( " | Глоб. поз. (%3.i )\n", glob_pos );
}

main.cpp
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
#include "file_pos.h"
#include "locale.h"
 
int main()
{ 
    setlocale( LC_ALL, "" );
 
    File_pos f1( "test.txt" );
 
    while ( !f1.is_eof() )
    {
        f1.Print();
        ++f1;
    }
    
    while ( !f1.is_begin() )
    {
        //++i;
        f1.Print();
        --f1;
    }
 
    f1.set_new_file( "test2.txt" );
 
    while ( !f1.is_eof() )
    {
        f1.Print();
        ++f1;
    }
    
    while ( !f1.is_begin() )
    {
        //++i;
        f1.Print();
        --f1;
    }
 
    system ("PAUSE");
    exit ( EXIT_SUCCESS );
}


Просьба уделить немного внимания и указать на какую-нибуть лажу
Может стоит что-то добавить?

И вопросик:
как лучше средствами C++ (может в STL есть) скопировать два массива?
я сделал так
Цитата Сообщение от Copy consuctor
C++
1
2
3
this->buffer = new char[ sz = strlen ( obj.buffer ) ];
        for (size_t i = 0; i < sz; ++i)
            this->buffer[i] = obj.buffer[i];
Заранее спасибо!!!
 
Текущее время: 08:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru