Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема при записи и выводе с бинарного файла 
V
    Опции темы
xVxSeRGxVx
  Дата 15.2.2010, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.2.2010
Где: Ладыжин, Киев

Репутация: нет
Всего: нет



вот в чём проблемка... я сначала ввожу данные, потом вызываю функцию записи в файл, при выводе, у меня появляется лишний елемент


мой клас и производный клас
Код

class Window
{
protected:
    char name[255];
    int center_x;
    int center_y;
    float height;
    int weigth;
public:
    //конструктор по умолчанию
    Window();
    //конструктор ініціалізації
    Window(char *namePr, int center_xPr, int center_yPr, int heightPr, int weigthPr);
    //конструктор копіювання
    Window(const Window &p);
    // Деструктор
    ~Window();

    char *getName();
    //Беремо координати цетру вікна по x
    int getCenter_x();
    //Беремо координати цетру вікна по у
    int getCenter_y();
    //Беремо значеня висоти вікна
    int getHeight();
    //Беремо значеня ширини вікна
    int getWeigth();

    int setWindCent(int, int);
    //Метод вводу і перевірки значення розмірів вікна
    int setWindSol(int, int);
    //Метод оновлення даних про координати тип вікна
    int updateCent();
    //Метод оновлення даних про розміри вікна
    int updateSol();

    //Метод вводу координат  центру вікна
    void setInitWindCent(Window*);
    //Метод вводу даних про розміри вікна
    void setInitWindSol(Window*);
    //Метод виведення даних про вікно
    void printwind2(Window*p, int count);
};


/**
 * Похідний клас
 **/
class WindowType : public Window
{
private: 
    char type;
public:
    //конструктор по умолчанию
    WindowType();
    //конструктор ініціалізації
    WindowType(char typePr, char *namePr,  int center_xPr, int center_yPr, int heightPr, int weigthPr);
    //конструктор копіювання
    WindowType(const WindowType &p);
    //деструктор похідного класу
    ~WindowType();

    //Метод вводу вихідних даних про вікно
    void readwind(WindowType*p);

    //Беремо значеня типу вікна
    char getType();
    //Встановлення типу вікна
    char setType();
    int countOfRecords(WindowType *t, ifstream &);
    //Метод вводу типу про вікно
    void setInitType(WindowType*);
    //Метод виведення даних про вікно
    void printwind2(WindowType*p, int count);

    void table_header();
    void table_footer();

    //узагальнюючий метод оновлення, який об"єднує всі під-оновлення
    //int update();

    int  fileReadWind(WindowType *, int);
    int  fileOutWind(WindowType *,int, int);

    void DelRecInArrInPos(WindowType *);
    //Метод, що додає запис в кінець файла
    void AddWindInFile(WindowType *, int);
    //Метод, що виводить к-ть записів у файлі
    void OutCountOfRecInFile(WindowType *);

 };



для записи в файл использую функцию fileReadWind
Код

int WindowType :: fileReadWind(WindowType *t, int count)
{
    ofstream fout(nameOfFile, ios_base :: out | ios_base :: trunc | ios_base :: binary);
    for (int i=0; i < count; i++)
    {
        fout.write( (char *) (&t[i]), sizeof(WindowType));
    }
    fout.close();    
return 0;
}


вывожу с файла функией 
Код

int WindowType :: fileOutWind(WindowType *win, int numbOfOut ,int modef)
{
    
    ifstream fin (nameOfFile, ios_base :: in | ios_base :: binary);
    //fin.clear();
    if (!fin)
    {
        cerr << "Error of open file - " << nameOfFile << endl;
        exit(1);    
    }
    int numb = countOfRecords(win, fin);
    int i=0;
    if (modef)
    {
        if (numbOfOut > numb)
        {
            cout << "\nYou enter the account number does not exist in the file (probably less records in the file)" << endl;
            return 1;
        }
        i = numbOfOut-1;
        numb = numbOfOut;
        cout << "numb(out): " << endl;
    }

    for (; i < numb ; i++)
    {
         fin.read( (char *) &win[i], sizeof(WindowType));
         cout << win[i].name << " " << win[i].type << " " << win[i].center_x << "/" << win[i].center_y << win[i].height << "*" << win[i].weigth << "\n";
    fin.close();    
return 0;
}


PM MAIL ICQ   Вверх
bsa
Дата 15.2.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Начнем с того, что функциональность fileReadWind() / fileOutWind() не соответствует названиям. В частности, первый почему-то пишет в файл, а второй читает.
Если это просто тут перепутаны названия, то рекомендую проверить в месте вызова записи, чему равен count. Делается это под отладчиком.
PM   Вверх
xVxSeRGxVx
Дата 15.2.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.2.2010
Где: Ладыжин, Киев

Репутация: нет
Всего: нет



ок пролистаю ещё разок отладчиком 

а в этом куске кода что я написал нормально всё ?

Это сообщение отредактировал(а) xVxSeRGxVx - 15.2.2010, 23:23
PM MAIL ICQ   Вверх
bsa
Дата 15.2.2010, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



xVxSeRGxVx, проблема в архитектуре... А так, компилироваться должно. А вот как работает х.з. - смысл не очень понятен.
PM   Вверх
xVxSeRGxVx
  Дата 16.2.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.2.2010
Где: Ладыжин, Киев

Репутация: нет
Всего: нет



вот ещё неясность, я немогу понять почему, но когда при выводе я использую функцию countOfRecords :



Код

int WindowType :: countOfRecords(WindowType *winT, ifstream &readFromFile)
{
   int num=0, i=0;
   while (!readFromFile.eof())
   {
        readFromFile.read( (char *) &winT[i], sizeof (WindowType));
        num++;
        i++;
   }
  
   return num--;
}


оно почемуто считает что в файле записано 2-е записи, НО, я перепроверил пошагово и в файл записалась только одна 
PM MAIL ICQ   Вверх
Albor
Дата 16.2.2010, 12:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



попробуй return --num;
PM MAIL ICQ   Вверх
bsa
Дата 16.2.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



xVxSeRGxVx, размер файла можно узнать и не прибегая к чтению, достаточно использовать метод seekg, указав ему положение 0 относительно конца файла. Затем метод tellg() вернет размер файла.

Добавлено через 3 минуты и 53 секунды
http://forum.vingrad.ru/topic-269794/view-.../p-1981664.html
PM   Вверх
xVxSeRGxVx
  Дата 16.2.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.2.2010
Где: Ладыжин, Киев

Репутация: нет
Всего: нет



Цитата(Albor @ 16.2.2010,  12:33)
попробуй return --num;

таки действительно проблема была в этом, у меня раньше там было написано return num-1; а я просто не подумал ы заменил на return num--;... 
спасибо smile

Добавлено через 2 минуты и 18 секунд
Цитата(bsa @ 16.2.2010,  12:37)
xVxSeRGxVx, размер файла можно узнать и не прибегая к чтению, достаточно использовать метод seekg, указав ему положение 0 относительно конца файла. Затем метод tellg() вернет размер файла.

Добавлено @ 12:41
http://forum.vingrad.ru/topic-269794/view-.../p-1981664.html

спасибо, за подсказку как узнать размер файла, в будущем пригодится, а и за ссылку ОГРОМНЕЙШЕЕ спасибо, буду теперь исключительно на руском выводить текст в с++ smile)))

тему можно закрыть smile
PM MAIL ICQ   Вверх
bsa
Дата 16.2.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(xVxSeRGxVx @  16.2.2010,  18:59 Найти цитируемый пост)
буду теперь исключительно на руском выводить текст в с++

Странно. Я вроде давал ссылку на ++i или i++...
PM   Вверх
xVxSeRGxVx
Дата 16.2.2010, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.2.2010
Где: Ладыжин, Киев

Репутация: нет
Всего: нет



Цитата(bsa @ 16.2.2010,  20:55)
Цитата(xVxSeRGxVx @  16.2.2010,  18:59 Найти цитируемый пост)
буду теперь исключительно на руском выводить текст в с++

Странно. Я вроде давал ссылку на ++i или i++...

да, дякую, але я побачив там і про російську мову і мене це зацікавило smile
PM MAIL ICQ   Вверх
bsa
Дата 17.2.2010, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




 ! 
bsa
xVxSeRGxVx, официальный язык форума - русский!

PM   Вверх
xVxSeRGxVx
  Дата 17.2.2010, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.2.2010
Где: Ладыжин, Киев

Репутация: нет
Всего: нет



упс... сори... всё исправляюсь ... что-то меня переклинило...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.