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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2008, 16:56   #1
sd13
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 21
По умолчанию Проекция файла и запись/чтение объектов класса в C++

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

буду ну оч благодарен!!!
sd13 вне форума Ответить с цитированием
Старый 21.05.2008, 17:25   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Объясните, пожалуйста, сначала, что именно Вы понимаете под проекцией файла, а то что кто-то сказал и что Вы пробовали отсюда не видно.
B_N вне форума Ответить с цитированием
Старый 21.05.2008, 18:19   #3
sd13
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 21
По умолчанию

вот листинг, объекты класса CInfo,...
Код:
#include "CSport.h"
#include "CCommand.h"
#include <iostream.h>
#include <fstream.h>
#include "CInfo.h"
#include <windows.h>
 
void main(){


const int N=3;
CInfo *obj=new CInfo;

	ofstream	Info("stock.dat",  ios::nocreate  );
	if(!Info)cout<<"err";
 
 
	obj->fEdSNm("Sazan \n  ");
	obj->fEdCountry("BY\n");
	obj->fEdNm(5);
 
    for(int i=0; i<11; i++){
		CInfo *obj=new CInfo;
		Info.write((char*)&obj, sizeof(CInfo));}
 
	 ifstream	LogPass3("stock.dat", ios::ate,ios::nocreate );
	 LogPass3.read((char*)&obj, sizeof(CInfo));

	 obj->fGetSName();
	 obj->fGetCountry();//работает ок


	Info.close();

   
	HANDLE hFile=CreateFile("stock.dat",GENERIC_READ|GENERIC_WRITE,0,NULL, OPEN_EXISTING,0,NULL);
	HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
	CInfo *ptr=(CInfo*)MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
 

	ptr[0].fEdNm(789); // инициализирует  номер
 	ptr[0].fGetNumber();// читает номер
// с последними двумя строчками выскакивает ерор, без них- ок
  
	UnmapViewOfFile(ptr);
	CloseHandle(hMap);
	CloseHandle(hFile);
}
//Пользуйтесь тэгом CODE

Последний раз редактировалось B_N; 21.05.2008 в 18:25.
sd13 вне форума Ответить с цитированием
Старый 21.05.2008, 18:21   #4
sd13
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 21
По умолчанию

вот вывод :

Sazan
BY
777
Press any key to continue
sd13 вне форума Ответить с цитированием
Старый 21.05.2008, 18:26   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от sd13 Посмотреть сообщение
// с последними двумя строчками выскакивает ерор, без них- ок
Какая именно ошибка?

--------------------------------------
Проверьте сначала отладчиком, у Вас файл не мэпается, или всё-таки с C++ проблемы. Как-то уж очень ловко Вы хотите объект создать без вызова конструктора и т.д.

Вот такой код сам по себе работает (при условии, что файл есть, иначе другие флаги в CreateFile)
Код:
	HANDLE hFile=CreateFile(TEXT("stock.dat"), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);  
	HANDLE hMap=CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);  
	long *ptr=(long*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);  

	*ptr += 100;

	UnmapViewOfFile(ptr);
	CloseHandle(hMap);
	CloseHandle(hFile);

Последний раз редактировалось B_N; 21.05.2008 в 18:48.
B_N вне форума Ответить с цитированием
Старый 21.05.2008, 19:01   #6
sd13
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 21
По умолчанию

пробывал cout - ом отлаживать, то до ptr выводит строку (я символично взял 777), а вставь я ее строчкой ниже- нет.
и тогда на выходе просто ничего не как бы ничего и нибыло. даже никакого предупреждения или ошибки не выкидывает.
как будто "невидимый" return !!!
я просто в замешательстве

вот точный листинг :
Код:
#include "CSport.h"
#include "CCommand.h"
#include <iostream.h>
#include <fstream.h>
#include "CInfo.h"
#include <windows.h>
 
void main(){
const int N=3;
CInfo *obj=new CInfo;

	ofstream	Info("stock.dat",  ios::nocreate  );
	if(!Info)cout<<"err";
 
 
	obj->fEdSNm("Sazan \n  ");
	obj->fEdCountry("BY\n");
	obj->fEdNm(5);
 
    for(int i=0; i<11; i++){
		CInfo *obj=new CInfo;
		Info.write((char*)&obj, sizeof(CInfo));}
 
	 ifstream	LogPass3("stock.dat", ios::ate,ios::nocreate );
	 
	 LogPass3.read((char*)&obj, sizeof(CInfo));

	 obj->fGetSName();  //выводит Zazan 
	 obj->fGetCountry();//выводит BY 


	Info.close();

   
	HANDLE hFile=CreateFile("stock.dat",GENERIC_READ|GENERIC_WRITE,0,NULL, OPEN_EXISTING,0,NULL);
	HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,sizeof(CInfo),NULL);
	if(hMap!=0) cout<<"map=0";
	CInfo *ptr=(CInfo*)MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
	 
  
	 	cout<<"777"<<endl; //это выводится
	ptr[0].fGetName();// a-z должна выводить строку и ее уже нет
	cout<<"777"<<endl; // и до сюда уже тоже не доходит :(
	ptr[0].fEdNm(789);
	cout<<ptr[0].fGetNumber()<<endl;
 

 
 
	UnmapViewOfFile(ptr);
	CloseHandle(hMap);
	CloseHandle(hFile);
}
для правильного создания ест конструктор по умолчанию

ptr тоже вроде бы ненулевой

просмотрел в отладчике :
hFile 0xffffffff
hMap 0x00000000
зек 0x00000000
---это что???

ptr 0x00000000

Последний раз редактировалось B_N; 21.05.2008 в 19:19.
sd13 вне форума Ответить с цитированием
Старый 21.05.2008, 19:18   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

sd13, для листингов есть тэг CODE. И не нужно делать гирлянду из постов. OxFFFFFFFF - это INVALID_HANDLE_VALUE - файл Ваш не открывается, так что мэпать нечего, ищите почему. А конструктор вызывается только если объект создаётсяявно, в стэке, или оператором new.
B_N вне форума Ответить с цитированием
Старый 21.05.2008, 19:44   #8
sd13
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 21
По умолчанию

извини, забыл вставить LogPass3.close(); - отловил при помощи GetLastError
но все равно пустой вывод.
по поводу конструктора - так у меня ведь CInfo *obj=new CInfo; - т.е. должно все быть ок!!!??? но нет...
и как пользоваться тэгом CODE ???
sd13 вне форума Ответить с цитированием
Старый 21.05.2008, 20:14   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

sd13, давайте всё-таки разобьём проблему на части.
1. Открытие файла. Если СreateFile возвращает -1, то дальше можно не смотреть - выясняйте, почему не открывается файл.
2. Создание секции. Если секция не создаётся и ptr == NULL, то дальше можно не смотреть, а проверять флаги во всех трёх функциях, размер файла и т.п.
3. C++. И что с того, что CInfo *obj=new CInfo ? Над объектом ptr, который Вы вытаскиваете из файла конструктор вызывался? Нет. А структура Вашего класса мне лично неизвестна. Я только вижу, что там куча методов, которые работают со строками, это уже достаточный повод задуматься. Что ещё есть в классе, должно оно быть сконструировано/проинициализировано - загадка. Если я могу сказать, что вот такой "класс"
Код:
#include <windows.h>

class Test
{
private:
	int a;

public: 
	Test()
	{
		a = 0;
	}
	void inc()
	{
		this->a ++;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hFile=CreateFile(TEXT("stock.dat"), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);  
	HANDLE hMap=CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);  
	Test *ptr=(Test*)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);  

	ptr->inc();

	UnmapViewOfFile(ptr);
	CloseHandle(hMap);
	CloseHandle(hFile);

	return 0;
}
работает, то про Ваш ничего не известно. Включая номер ошибки и состояние указателя. Я так и не понял до конца, "ptr 0x00000000" - это всегда? Какой тогда смысл над ним вызывать методы класса...

Тэг CODE:
[CODE]panic("He-He");[/CODE]
Или кнопка "#" над окном редактирования.
B_N вне форума Ответить с цитированием
Старый 22.05.2008, 00:19   #10
sd13
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 21
По умолчанию

тут просто простое и множественное наследование
сча попытаюсь изобразить:
класс CSport->CCommand-
->CInfo
CCountry-

надеюсь наглядно.
Код:
struct Sportsman
{


    int		mAge;
    char 	szName[11];
    char 	szSurname[11];
    int		mWeight;
    int		nGrowing;
    int		mNumber;

};
class CSport
{
public:
	virtual void fEdNm(char*);
	virtual void fEdNm(int);
	virtual void fEdSNm(char*);
	virtual void fEdType(char*);
	
	virtual int fGetNumber()const;
	virtual void fGetTypeOfSport()const;
	virtual void fGetSName()const;
	virtual void fGetName()const;

	CSport();
	CSport(char*, char*, char*, int, int, int, int);

	    virtual  ~CSport();
		virtual void fView( )const;
		virtual void fAdd();

protected:

	char szTypeOfSport[11];
	Sportsman msSportsman;

private:
};
class CCommand : public CSport
{
public:
	virtual void fGetCommand()const;
	virtual void fAdd();
	CCommand();	
    CCommand(char*, char*, char*, int, int, int, int,  char*);
virtual    ~ CCommand();    
    virtual void fView()const;

protected:
 
	char mCommand[11];
};
class CCountry
{
public:

	CCountry();
	CCountry(char*);
	CCountry(const CCountry&obj);
	
	virtual void fGetCountry()const;
	virtual void fAdd();
	virtual  ~CCountry();
    void fView()const;

protected:

    char  szCountry[11] ;
};
class CInfo : 
    public CCommand, 
    public CCountry
{
public:
 
	CInfo& operator=(  CInfo & cpy);
	bool operator <(  CInfo& obj2);
	CInfo(const CInfo&);
	friend ostream & operator<<(ostream&, const CInfo&);
	virtual void fEdCountry(char*);
	virtual void fView()const;
	CInfo();
	virtual void fAdd();
 
    CInfo(char*, char*,char*, int, int, int, int, char*, char*);
 
	static int count;
 

};
примерно так
с ошобками хэндлов разрулил, но результата нет - просто выводит press any key
sd13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись в файл и чтение из него. Swool Общие вопросы C/C++ 8 26.08.2008 16:39
Запись и чтение файла... Altera Общие вопросы Delphi 5 06.05.2008 20:22
Запись и чтение сообщений Altera Работа с сетью в Delphi 6 13.04.2008 03:31