Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Запись работы класса в фаил
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
gallini gallini вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.10.2010
Question Запись работы класса в фаил - 08.01.2011, 20:26

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

void diskIn(int bn){//чтение данных о числе книг bn из файла
ifstream infile;//создать поток
infile.open(file_name);//открыть его
infile.seekg(bn*sizeof(MyLibrary));//сдвиг файлового указателя
infile.read((char*)this,sizeof(*this));//чтение данных об одной книге
}

void diskOut()//записать в конец файла
{
ofstream outfile;//создать поток и открыть его
outfile.open(file_name,ios_base::app);
outfile.write((char*)this,sizeof(*this));//записать в него
}

static int diskCount()//число книг в файле
{
ifstream infile;
infile.open(file_name);
infile.();//перейти в позицию "0 байт от конца файла" вычислить кол-во книг
return (int)infile.tellg(),sizeof(MyLibrary);
}

Буду очень признательна
Ответить с цитированием
  (#2 (permalink)) Старый
gallini gallini вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.10.2010
По умолчанию 09.01.2011, 02:30

Пожалуйста, люди, помогите, эти функции для двоичных файлов, а мне нужно для текстовых
Может кто-нить подскажет как сделать проще....
Ответить с цитированием
  (#3 (permalink)) Старый
Alex_cs_gsp Alex_cs_gsp вне форума
Member
 
Сообщений: 56
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.12.2008
По умолчанию 09.01.2011, 10:16

Ваша задача не ясна! То ли вам с функциями разобраться нужно, то ли что-то сделать?
Ответить с цитированием
  (#4 (permalink)) Старый
gallini gallini вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.10.2010
По умолчанию 09.01.2011, 14:04

Прошу прощения за не правильную постановку вопроса. Мне нужно вывести в текстовый фаил работу класса. Код который я выложила в первом сообщение, то что я нашла в книжке, но он не работает
Ответить с цитированием
  (#5 (permalink)) Старый
Alex_cs_gsp Alex_cs_gsp вне форума
Member
 
Сообщений: 56
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.12.2008
По умолчанию 09.01.2011, 20:21

Работа класса это что? Вам нужно вести лог? Опишите задачу подробнее
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
gallini gallini вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.10.2010
По умолчанию 10.01.2011, 00:36

Alex_cs_gsp, задача следующая: создать класс «Домашняя библиотека». Предусмотреть возможность хранения о книгах следующей информации: автор, название, год издания. Предусмотреть следующие функции: конструктор по умолчанию, конструктор с параметрами, изменение данных о книге, получение данных о книге. В тестовом приложении продемонстрировать работу с классом.
Класс создан, осталось только вывести в фаил...
Ответить с цитированием
  (#7 (permalink)) Старый
Alex_cs_gsp Alex_cs_gsp вне форума
Member
 
Сообщений: 56
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.12.2008
По умолчанию 10.01.2011, 01:36

Из вашего ответа, отнюдь не понятно, что и зачем вывести в файл.
В вашем случае, если действительно нужно хранить информация о книге в виде БД, то можно использовать SQLite, чтобы велосипед не изобретать. У Вас задача реализовать БД??? Если задача стоит, чтобы в текстовом файле хранить информацию, то это можно решить использовав XML, при условии, что БД очень простая., для этого можно использовать MSXML, или xerces. В любом случае задание не корректно.
Но что-то мне кажется, что у вас какая то типа лабораторная работа на связанные списки и с простенькой сериализацией в текстовый файл, глубоко забивая на теория БД.
Ответить с цитированием
  (#8 (permalink)) Старый
gallini gallini вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.10.2010
По умолчанию 10.01.2011, 11:09

Это не лабараторка, а просто подготовка к модулю по ООП на языке С++
Преподавательница дала примеры задачек, вот сижу разбираю.
Сейчас программка вроде как заработала, но в текстовом и в двоичном файлах вместо нормального текста:
ММММqI   ММММ!I   Ф
а в консоле программа выводит следующее

Enter autor: Prada
Enter title book: C++
Enter the year of publication of the book: 2000
Continue (y/n)?n
In the file1 book(s)
Book 1
Autor book: Prada
Book title: C++
Year of publication of the book: 2000


а когда запускаю программу второй раз,
Enter autor: Lafor
Enter title book: Programms_C++
Enter the year of publication of the book: 2004
Continue (y/n)?n
In the file2 book(s)
Book 1
Autor book: Lafor
Book title: Programms_C++
Year of publication of the book: 2000

Book 2
Autor book: Lafor
Book title: Programms_C++
Year of publication of the book: 2004

Вопрос, почему в файлах пишется не понятный текст а в консоле авторы и название книг берется последней книги
Ответить с цитированием
  (#9 (permalink)) Старый
gallini gallini вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.10.2010
По умолчанию 10.01.2011, 11:13

cpp Код:
//Library.h
#ifndef MYLIBRARY_H
#define MYLIBRARY_H
#include <iostream>
#include <string>//возврат строки
using namespace std;

class MyLibrary
{
private:
    string _autor;//принадлежит <string>
    string _title;//принадлежит <string>
    int _year;//год издания
public:
    MyLibrary()
    {
        _autor="no name";
        _title = "no title";
        _year = 0000;
    }

    MyLibrary(string autor, string title, int year)
    {
        _autor = autor;
        _title = title;
        _year = year;
    }

    ~MyLibrary(){}

    void setAutor(string autor){ autor=_autor; }
    void setTitle(string title){ title=_title; }
    void setYear(int year){ year=_year; }

    string getAutor(){ return _autor; }//get возвращает
    string getTitle(){ return _title; }
    int getYear(){ return _year; }

    void getBook(){
    cout << "Enter autor: "; cin >> _autor;
    cout << "Enter title book: "; cin >> _title;
    cout << "Enter the year of publication of the book: "; cin >> _year;
    }

    void disp() {
        cout <<"Autor book:" << _autor;
        cout << endl;
        cout <<"Book title: " << _title;
        cout << endl;
        cout <<"Year of publication of the book: "<< _year;
        cout << endl<<endl;
    }

    void diskIn(int);//чтение из файла
    void diskOut();//запись в фаил
    static int diskCount();//число человек в файле

};
#endif
[/HIGHLIGHT][/HIGHLIGHT]
Ответить с цитированием
  (#10 (permalink)) Старый
gallini gallini вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.10.2010
По умолчанию 10.01.2011, 11:16

//Library.cpp
#include <fstream>

const char *file_name = "library.txt";

#include "MyLibrary.h"


void MyLibrary::diskIn(int pn)//чтение данных о числе человек pn из потока
{
ifstream infile;//создать поток
infile.open(file_name);//открыть его
infile.seekg(pn*sizeof(MyLibrary));//сдвиг файлового указателя
infile.read((char*)this,sizeof(*this));//чтение данных об одном человеке
}

void MyLibrary::diskOut()//запись в конец файла
{
ofstream outfile;//создать поток
outfile.open(file_name,ios::app);//открыть его
outfile.write((char*)this,sizeof(*this));//записать в него
}

int MyLibrary::diskCount()//число людей
{
ifstream infile;
infile.open(file_name);//открыть его
infile.seekg(0,ios::end);//перейти на позицию "0 байт от конца файла" вычислить кол-во людей
return (int)infile.tellg()/sizeof(MyLibrary);
}
Ответить с цитированием
  (#11 (permalink)) Старый
gallini gallini вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.10.2010
По умолчанию 10.01.2011, 11:17

//test.cpp
#include "MyLibrary.h"

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <conio.h>
using namespace std;

int main()
{
MyLibrary m;//создать пустую запись
char ch;

do{//сохранение данных на диске
m.getBook();//получение данных
m.diskOut();//запись данных
cout << "Continue (y/n)?";
cin >> ch;
}while(ch=='y');//цикл до 'n'

int n = MyLibrary::diskCount();//сколько книг в файле?
cout << "In the file" << n << " book(s) \n";
for (int j=0;j<n;j++)//для каждой
{
cout << "Book "<< j+1;
cout << endl;
m.diskIn(j);//считать с диска
m.disp();//вывести данные
}

cout << endl;

getch ();
return 0;
}
Ответить с цитированием
  (#12 (permalink)) Старый
gallini gallini вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.10.2010
По умолчанию 10.01.2011, 11:18

Выложила код, может кто-то увидит что нужно исправить
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
vps vps вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.01.2011
По умолчанию 12.01.2011, 21:48

Попробуйте вместо типа "string" использовать, например массив символов типа "char"...
На счёт того, что в файле у вас краказябры, то это из-за того, что в файл вы пишете объект (а он состоит из кучи разных полей и т.п.). Видимо компилятор сам подставляет флаг записи и чтения ios::binary. Но чтобы не путаться - сами пишите данный флаг.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
фаил хост alex99-81 Любые вопросы от новичков 1 10.01.2011 23:42
Создание объектов дочернего класса из метода базового класса Jonano С/С++ 14 01.03.2010 17:40
Создание шаблона класса для работы с массивом произвольного типа -R- Вопросы начинающих программистов 1 25.04.2008 23:31
Как массив Double в фаил добавит Lavaza C++ Builder 11 16.08.2007 14:26
Как получить фаил типа .obj Roof Assembler 3 09.08.2007 09:55
Как создать ЕХЕ фаил в Builder Alex911T C++ Builder 3 01.11.2006 14:13
Разработка класса CVector для работы с векторами в C++ SHELTEM Вопросы начинающих программистов 9 12.09.2005 20:14
Запись результата работы программы в новый файл? prol Prolog 1 11.05.2005 22:49
Как открыть поток на чтение и запись, причем запись в конец файла Borro С/С++ 6 16.03.2005 14:47
Обеспечение работы с файлами в приложении на основе класса CHtmlView Anonymous Visual C++ 1 12.10.2003 13:11
Вызов метода класса, не создавая при этом объекта этого класса в MessageBox LeM2003 Visual C++ 6 03.10.2003 17:05
Как вызвать другое приложение bat фаил Anonymous Visual C++ 5 11.09.2003 12:17



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов