Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677

Перегрузка оператора равно для класса файла

19.09.2014, 17:03. Показов 1296. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Помогите разобраться с перегрузкой.
Идея в том, чтобы экземпляр класса создавал иллюзию работы с массивом. Т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
class File
{
//...
}
 
File file;
file.open("1.txt");
//Пока всё просто и понятно, а дальше перегрузки =
 
char simbol=file[1024];//тут позиционируем по файлу со смещением после чего считываем из файла
 
file[1024]=simbol;//тут позиционирование происходит так же на 1024 после чего запись в файл
С первым более-менее понятно - перегрузка оператора =. А вот второе... Есть идеи?
Как уже написал, конечная цель - работать с файлом, как с массивом. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2014, 17:03
Ответы с готовыми решениями:

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников,...

Перегрузка оператора для класса
Здравствуйте! Подскажите, пожалуйста, почему так не работает: class ClassA { public: ClassA() { m = 1; ...

Перегрузка оператора -> для шаблонного класса
Как это написать не понимаю помогите пожалуйста Добавлено через 23 секунды пример кода пожалуйста

16
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,649
Записей в блоге: 6
19.09.2014, 17:22
Цитата Сообщение от Retyrn0 Посмотреть сообщение
С первым более-менее понятно - перегрузка оператора =. А вот второе... Есть идеи?
Все уже украдено придуманно за нас.
C++
1
2
3
T& operator[] (int n) {
    ...
}
Перегрузка = здесь не причем.
1
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
19.09.2014, 17:24  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Все уже украдено придуманно за нас. Код C++1
2
3
T& operator[] (int n) {
* * ...
}
Логично) Спасибо, чёт я вообще в эту сторону не подумал
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.09.2014, 17:54
Мне вот интересно, как это все будет работать во втором случае. Прочитали значение из файла в данной позиции, вернули его, а дальше что? Можно, конечно, хранить все в буфере. И где-то там проверять, когда его необходимо сбросить на диск.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
20.09.2014, 01:06  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
а дальше что?
А дальше ничего...на самом деле не понял вопроса, но если мои догадки верны, то попытаюсь ответить так: мне не нужно ничего хранить. У меня одноразовые доступы к файлу и мне заранее известно где в файле то, что мне нужно и куда что-то нужно записать. Имитация массива в моём случае - максимально понятная и читабельная интерпретация работы с файлами. Ну и ещё, чисто для себя, хочу поглубже раскопать перегрузку операторов, а конкретная задача для этого весьма полезнее, чем аналогия ХэллоВорлд.)
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
20.09.2014, 12:45
Вы не совсем поняли мою мысль. Как Вы будете осуществлять запись в файл в данном случае?
Цитата Сообщение от Retyrn0 Посмотреть сообщение
file[1024]=simbol;
Перегрузите Вы operator[], а что в нем будет происходить?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
20.09.2014, 12:47
Цитата Сообщение от Toshkarik Посмотреть сообщение
Мне вот интересно, как это все будет работать во втором случае. Прочитали значение из файла в данной позиции, вернули его, а дальше что? Можно, конечно, хранить все в буфере. И где-то там проверять, когда его необходимо сбросить на диск.
Отображение файла в память решает большую часть подобных проблем.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
20.09.2014, 12:55
Это понятно, мне было интересно, какая идея была у ТС.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
20.09.2014, 13:08
Цитата Сообщение от Toshkarik Посмотреть сообщение
Как Вы будете осуществлять запись в файл в данном случае?
Ну как вариант, можно возвращать не T, а некий proxy<T> который "знает" как писать в файл по смещению (т.е. имеет перегруженый оператор= с соответствующей функциональностью).
3
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
24.09.2014, 13:48  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
а что в нем будет происходить
Файл[x]=value;
...
value=Файл[x];

Внутри fseek-и, fread-ы и fwrite-ы.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
24.09.2014, 13:56
Retyrn0, ну так я и спрашиваю, как внутри operator[] будет использоваться fwrite? Ведь он в качестве параметра принимает только индекс.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
24.09.2014, 15:09  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
в качестве параметра принимает только индекс.
Вот это логично. Таким образом это невозможно? В этом и вопрос - как? Или никак?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
24.09.2014, 15:19
Таким образом - нет. Чуть выше DrOffset подсказал, как можно сделать.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
24.09.2014, 15:22  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
DrOffset подсказал, как можно сделать.
За что огромное спасибо, но я не до конца понимаю что он имел ввиду)
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
24.09.2014, 15:36
Примерно вот так:

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
class FileProxy {
public:
   FileProxy( FILE *f, int i )
      :  file( f ),
         idx( i )
   {
      
   }
   
   void operator=( char ch ) {
      fseek...
      fwrite...
   }
   
   operator char() {
      char tmp;
      
      fseek...
      fread...
      
      return tmp;
   }
   
private:
   FILE *file;
   int   idx;
};
 
class File {
public:
   ...
   
   FileProxy operator[]( int idx ) {
      return FileProxy( file, idx );
   }
   
   ...
private:
   FILE *file;
   ...
};
2
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
24.09.2014, 16:11  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
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
class FileProxy {
public:
* *FileProxy( FILE *f, int i )
* * * : *file( f ),
* * * * *idx( i )
* *{
}
void operator=( char ch ) {
* * * fseek...
* * * fwrite...
* *}
operator char() {
* * * char tmp;
fseek...
* * * fread...
return tmp;
* *}
private:
* *FILE *file;
* *int * idx;
};
class File {
public:
* *...
FileProxy operator[]( int idx ) {
* * * return FileProxy( file, idx );
* *}
...
private:
* *FILE *file;
* *...
};
Ого) Спасибо огромное, сейчас буду ковыряться.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
26.09.2014, 13:47  [ТС]
Если кто-то после меня тоже захочет поизгаляться, вот результат:

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
#include <windows.h>
#include <stdio.h>
 
class FileProxy
{
public:
    FileProxy(FILE*f,UINT64 i):file(f),idx(i){}
    void operator=(char ch)
    {
        _fseeki64(file,idx,SEEK_SET);
        fwrite(&ch,1,1,file);
    }
 
    operator char()
    {
        char ch;
        _fseeki64(file,idx,SEEK_SET);
        fread(&ch,1,1,file);
        return ch;
    }
private:
    FILE    *file;
    UINT64  idx;
};
 
class File
{
public:
    File(char*FilePath)
    {
        file=fopen(FilePath,"r+b");
        if(file==NULL){file=fopen(FilePath,"wb");fclose(file);file=fopen(FilePath,"r+b");}
    }
    ~File(){if(file!=NULL)fclose(file);}
 
    FileProxy operator[](UINT64 idx){return FileProxy(file,idx);}
 
private:
    FILE *file;
};
 
File file("filename.bin");
char ch=230;
file[0]=ch;
//...
ch=file[0];
//эта хрень работает
Добавлено через 1 минуту

Не по теме:

Спасибо всем откликнувшимся.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2014, 13:47
Помогаю со студенческими работами здесь

Перегрузка оператора -> для шаблонного класса
Здравствуйте! Возникла проблема: не могу додуматься как перегрузить оператор -&gt; так, чтобы он корректно работал. Вот код: ...

Перегрузка оператора ( ) для объектов класса
Здравствуйте! перегрузили оператор (). Каким образом компилятор поймет где мы вызываем оператор (), а где , например, конструктор? каким...

Перегрузка оператора + для класса Date
Здравствуйте! Как правильно перегрузить оператор +(Date, int) для класса Date, чтобы дата увеличивалась на нужное количество дней? При этом...

Перегрузка оператора- для шаблона класса
Ребят подскажите что не так я делаю или подтолкните в нужное русло =\ З.Ы. Массивы будем рассматривать одинаковой длины. #include...

Перегрузка оператора + для класса String
Подскажите, как реализовать перегрузку оператора сложения для класса String Вот, что пока получилось: #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru