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

Мой класс для работы с файлами - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Среднее значение элементов очереди http://www.cyberforum.ru/cpp-beginners/thread610228.html
Всем доброго времени суток. Задача такова. Имеется структура const int n=27; struct Transport { char surname; // фамилия char name; // имя char middleName; // отчество int amount; ...
C++ Красно-черное дерево (класс, шаблон и его реализация) всем привет, у меня возникла проблема в создании шаблона, в обычном виде т.е. в не шаблонном, он работает нормально НО как только пытаюсь сделать шаблон и поставить везде куда надо template так тут... http://www.cyberforum.ru/cpp-beginners/thread610217.html
Прата - составные типы C++
Добрый день. Недавно начал заниматься С++ по книге Прата. Прошел четвертую главу и встретил такую задачу: Напишите программу С++, которая запрашивает и отображает информацию, как показано в...
C++ Создать иерархию типов. c++
Здравствуйте! Посмотрите пожалуйста программу. Правильно ли построены классы. Задание: Создать иерархию типов - транспорт, корабль, пассажирский транспорт и пассажирский корабль. Использовать...
C++ "текст в базе" и действия на клавиши http://www.cyberforum.ru/cpp-beginners/thread610141.html
Короче мне нужно сделать так чтоб по нажатию на кнопку в файле по адрессу(залитому на сайт какойнить) проверялась наличие текста написанного в техтбоксе 1 например! И если текст есть то например...
C++ Перемножение разреженных матриц Программа для перемножения разреженных матриц. все работает нормально, за исключением того, что при матрицах большого размера (1000+) считает от 10 минут и дольше. Помогите исправить код (как мне... подробнее

Показать сообщение отдельно
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932

Мой класс для работы с файлами - C++

21.06.2012, 09:58. Просмотров 2353. Ответов 9
Метки (Все метки)

Здравствуйте! Я попробовал сделать свой класс для работы с файлами и показать его здесь с целью узнать, что я в нем сделал не так

Класс называется File.
В нем один закрытый член - fstream file. Это файл, с которым программист будет работать.

У класса присутствуют следующие функции:
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
inline void open (char* name, long int mode);
// Функция открывает файл для того, чтобы программист мог дальше с ним
// работать. Она принимает 2 аргумента:
// name - указатель на строку с именем открываемого файла или путем к нему;
// mode - режим, в котором файл открывается (о том, как его выбирать,
// см. далее)
 
inline bool openAndCheck (char* name, long int mode);
// Функция делает то же, что и предыдущая, но после проделанного
// возвращает значение true, если все прошло успешно или же
// false, если произошла ошибка.
 
inline bool isOpened ();
// Функция возвращает true, если файл открыт или же false, если он закрыт.
 
inline void close ();
// Функция закрывает открытый файл.
 
inline void readContent (type* pointer, int length);
// Шаблонная функция. Считывает length байтов и записывает их по
// адресу, на который указывает pointer.
 
inline void readString (char* pointer, int length);
// Функция записывает в строку, на которую указывает указатель pointer
// length символов и добавляет после них символ завершения строки ('\0').
 
inline void read (type* pointer);
// Шаблонная функция. Записывает информацию в переменную, расположенную
// по адресу, на который указывает указатель pointer. Считывает ровно столько,
// сколько способна вместить переменная. Иначе говоря, считывает sizeof(type)
// байт.
 
inline void read (type* array, int length);
// Функция считывает количество байт, равное количеству байт, занимаемых
// length ячейками массива типа type и записывает их в массив array. Функция шаблонная.
 
inline void readBlock (type* pointer);
// Шаблонная функция. Читает блок из файла и помещает его в переменную по адресу,
// на который указывает pointer. Под блоком подразумевается все,
// находящееся до разделительного символа (табуляции, пробела и т. д.).
 
inline void writeContent (type* pointer, int length);
// Функция записывает length байт, расположенных по адресу,
// на который указывает переменная pointer, в файл. Функция шаблонная.
 
inline void write (type* pointer);
// Шаблонная функция. Записывает переменную, на которую указывает
// указатель pointer, в файл.
 
inline void write (type* array, int length);
// Шаблонная функция. Записывает массив array длинной length в файл.
 
inline void writeAsText (type variable);
// Шаблонная функция. Записывает переменную variable в файл в текстовом виде.
 
inline void writeAsText (type* pointer);
// Шаблонная функция. Делает все то же самое, что и предыдущий вариант
// этой функции, но принимает в качестве аргумента не саму переменную,
// а указатель на нее.
 
inline int getPointerPosition ();
// Функция возвращает номер символа, на который сейчас "смотрит"
// указатель файла (я не знаю, как это точно называется :)).
 
inline void setPointerPosition (int position);
// Функция перемещает указатель файла на символ, чей номер position.
 
inline bool isAllRight ();
// Функция возвращает true, если все в порядке, или же false, если нет.
Конструкторы и деструкторы класса:
C++
1
2
3
4
5
6
7
8
inline File ();
// Этот конструктор ничего не делает.
 
inline File (char* name, long int mode);
// Этот конструктор вызывает функция open с параметрами name и mode
 
inline ~File ();
// Деструктор вызывает функцию close.
Все функции имеют модификатор inline, потому что все они очень короткие, и на мой взгляд, нет нужды ради них выделять отдельное место в стеке и тратить на это время.

Так каким же образом можно указать параметр mode функции open? Первый способ: такой же, как и у функции fstream::open:
C++
1
File file(name, ios::in | ios::out | ios::ate);
Но есть схожий, но на мой взгляд, более удобный способ:
C++
1
File file(name, File::forInput | File::forOutput | File::moveToEnd)
Здесь показано, какие флаги ios идентичны флагам класса File:
C++
1
2
3
4
5
6
File::forAppend = ios::app
File::moveToEnd = ios::ate
File::asBinary = ios::binary
File::forInput = ios::in
File::forOutput = ios::out
File::truncate = ios::trunc
Пример использования класса:
C++
1
2
3
4
5
6
7
8
File file("text.txt", File::asBinary | File::truncate | File::forOutput | File::forInput);
 
int n = 5;
file.writeAsText(n);
file.setPointerPosition(0);
char s[2];
file.readString(s, 1);
std::cout << s;
Вот так выглядит код класса:
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
#include <fstream>
 
class File {
    private:
        std::fstream file;
    public:
        // конструкторы и деструктор:
 
        inline File () {}
 
        inline File (char* name, long int mode) {
            open(name, mode);
        }
 
        inline ~File () {
            close();
        }
 
 
        // открытие и закрытие файла:
 
        inline void open (char* name, long int mode) {
            file.open(name, std::ios::openmode(mode));
        }
 
        inline bool openAndCheck (char* name, long int mode) {
            open(name, mode);
            return isAllRight();
        }
 
        inline bool isOpened () {
            return file.is_open();
        }
 
        inline void close () {
            file.close();
        }
 
        // чтение файла:
 
        template <class type> inline void readContent (type* pointer, int length) {
            file.read(reinterpret_cast<char*>(pointer), length);
        }
 
        inline void readContent (char* pointer, int length) {
            file.read(pointer, length);
        }
 
        inline void readString (char* pointer, int length) {
            file.read(pointer, length);
            *(pointer+length) = '\0';
        }
 
        template <class type> inline void read (type* pointer) {
            readContent(reinterpret_cast<char*>(pointer), sizeof(pointer));
        }
 
        template <class type> inline void read (type* array, int length) {
            readContent(reinterpret_cast<char*>(array), sizeof(type)*length);
        }
 
        template <class type> inline void readBlock (type* pointer) {
            file >> *pointer;
        }
 
        // запись в файл:
 
        template <class type> inline void writeContent (type* pointer, int length) {
            file.write(reinterpret_cast<char*>(pointer), length);
        }
 
        inline void writeContent (char* pointer, int length) {
            file.write(pointer, length);
        }
 
        template <class type> inline void write (type* pointer) {
            writeContent(reinterpret_cast<char*>(pointer), sizeof(type));
        }
 
        template <class type> inline void write (type* array, int length) {
            writeContent(reinterpret_cast<char*>(array), sizeof(type)*length);
        }
 
        template <class type> inline void writeAsText (type variable) {
            file << variable;
        }
 
        template <class type> inline void writeAsText (type* pointer) {
            file << *pointer;
        }
 
        // перемещение и получение позиции указателя:
 
        inline int getPointerPosition () {
            return file.tellp();
        }
 
        inline void setPointerPosition (int position) {
            file.seekp(position);
        }
 
        // проверка состояния файла:
 
        inline bool isAllRight () {
            return file.good();
        }
 
        // флаги для выбора режима работы с файлом:
 
        const static long int forAppend = 1L << 0;
        const static long int moveToEnd = 1L << 1;
        const static long int asBinary = 1L << 2;
        const static long int forInput = 1L << 3;
        const static long int forOutput = 1L << 4;
        const static long int truncate = 1L << 5;
};
С радостью выслушаю все пожелания и замечания.

Добавлено через 17 часов 30 минут
Немного подкорректировал стиль названий данных: названия переменных начинаются, как и раньше, с маленькой буквы, а названия функций теперь начинаются с большой буквы.

Добавил новую функцию.
C++
1
2
3
4
5
6
7
inline void ReadString (char* pointer);
// Функция считывает строку с файла и записывает ее в строку,
// расположенную по адресу, на который указывает pointer.
// Ее отличие от функции ReadString (char* pointer, int length)
// заключается в том, что этой функции не нужно сообщать
// длину считываемой строки. Строка считается оконченной,
// когда в файле встретится символ окончания строки - '\0'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru