Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2017, 22:54   #1
AlexMIEL
Новичок
Джуниор
 
Регистрация: 28.09.2017
Сообщений: 2
По умолчанию Итератор для работы с файлом.

Всем привет. Возник вопрос. Задача: сделать свой итератор и считывать инты из бинарного файла. Мой итератор пока вообще не работает, не заходит в цикл, хотя вроде логика есть. Какие нибудь советы?

Код:
#include <iostream>
#include <cstdio>


using namespace std;


class IntFile
{
public:
    //int index = 0;
    int value;
    FILE* file;
    IntFile() {}
    ~IntFile() {}
    int mnumbers[10];
    int mnumbers2[10];
    int mnumbers3[10];


    int getValue(int index)
    {
        fseek(file, 4*index, SEEK_SET);
        fread(&value, 4, 1, file);
        return value;
    }

    friend struct iterator;
    struct iterator
    {
        int index = 0;
        int value = 0;

        bool operator=(const iterator&other) const
        {
            return index == other.index;
        }
        bool operator!=(const iterator&other) const
        {
            return index!=other.index;
        }

        int &operator*()
        {
            //return value = IntFile::getValue(int index);
        }
        iterator&operator++()
        {
            this->index = index+1;
        }
        iterator&operator--()
        {
            index = index -1;
        }
    };
    iterator begin()
    {
        fseek(file, 0, SEEK_SET);
        //index = 0;
    }
    iterator end()
    {
        fseek(file, 0, SEEK_END);
        //index = 9;
    }
};



int main()
{
    IntFile file;
    int A;
    // Getting numbers from user and putting them to array
    /*
    cout << "Enter your numbers: ";
    for ( int i = 0; i < 10; i++)
    {
        cin >> file.value;
        file.mnumbers[i] = file.value;
        //cout << file.mnumbers[i] << " ";
    }
    cout << endl;


    file.file = fopen("text.txt", "r+b");
    fwrite(file.mnumbers,4,sizeof(file.mnumbers),file.file);
    fclose(file.file);
    */

    for ( int i = 0; i < 10; i++)
    {
        file.mnumbers2[i] = 0;
        cout << file.mnumbers2[i] << " ";
    }


    file.file = fopen("text.txt", "r+b");
    for (IntFile::iterator Iter = file.begin(); Iter != file.end(); ++Iter)
    {
        fread(file.mnumbers2,4,1,file.file);
        cout << " I " << endl;
        //cout << "Iterator: " << Iter;
    }

    cout << endl;
    A = file.getValue(9);
    cout << "A: " << A << endl;

    //cout << "array : ";
    for ( int i = 0; i < 10; i++)
    {
        cout << file.mnumbers2[i] << " ";
    }


    ////////////////////////////////////////
    fclose(file.file);
    return 0;
}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Alex11223; 29.09.2017 в 19:09.
AlexMIEL вне форума Ответить с цитированием
Старый 28.09.2017, 23:45   #2
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от AlexMIEL Посмотреть сообщение
Какие нибудь советы?
std::istream_iterator<int>?
Croessmah вне форума Ответить с цитированием
Старый 29.09.2017, 16:43   #3
AlexMIEL
Новичок
Джуниор
 
Регистрация: 28.09.2017
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
std::istream_iterator<int>?
нет, к сожалению, просят именно так
AlexMIEL вне форума Ответить с цитированием
Старый 29.09.2017, 17:22   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Как так? Вы видели сколько стандартных функции у итераторов?

Не заходит он в цикл, потому что они ДОЛЖНЫ ВОЗВРАЩАТЬ что-то указывающие на начало и конец. А так вам скорее всего заботливый компилятор подставил return 0 и начало совпало с концом.
p51x вне форума Ответить с цитированием
Старый 29.09.2017, 17:37   #5
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Код:
iterator&operator++()
        {
            this->index = index+1;
            return *this;
        }
        iterator&operator--()
        {
            index = index -1;
            return *this;
        }
...и в таком духе. Кроме того, открыть главу про итераторы и почитать, какие ОБЯЗАТЕЛЬНЫЕ функции должны в нем быть. Скажем прямо - их там дофига, пару экранов кода выходит для RandomAccess.

Бывают они 3 типов: ввода, вывода и комбинация....первые два покороче будут.

Последний раз редактировалось Alex11223; 29.09.2017 в 19:08.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Итератор для двусвязного списка Black_Dynamite Помощь студентам 0 07.11.2013 22:04
Программа для работы с текстовым файлом Dark Illusion Общие вопросы Delphi 5 30.03.2012 00:37
Итератор для класса. Orli Общие вопросы C/C++ 1 17.02.2012 20:53
Delphi. Консольное приложение для работы с txt. файлом MexX Помощь студентам 1 13.05.2009 09:37
Переделать для работы с файлом Dekker Общие вопросы C/C++ 1 18.04.2009 18:31