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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2012, 15:55   #1
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию Потоки, приведение типов.

Код:
#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>
using namespace std;


template <typename Type>
class Box{
	public: Type T;
			Box<Type>* Next;
			Box(){T=0; Next=NULL;}
			Box(int t){T=t; Next=NULL;}
			friend istream& operator>>(istream &ist, Box<Type> &Y){ist>>Y.T; return ist; };
			friend ostream& operator<<(ostream &ost, Box<Type> &Y){ost<<Y.T; return ost; };
};

template <class Class> 
class List{

public: 
	Box<Class>* Begin;
	string Name;
	List(){Begin=0;};
	void Show(){
		/*ifstream ifst(Name.c_str());*/

	
	
	
	};

	void Sort(){};

	void Download(Box<Class>BOX[], int &BCounter){
		cout<<"What is the next item in the list?: ";
		cin>>BOX[BCounter];
		if(Begin!=0){BOX[BCounter].Next=Begin;}
		Begin=&BOX[BCounter];
		if ((BCounter+1)==11){Refresh(); BCounter=0;} //если массив элементов переполнен. все элементы записать в файл и писать следующие элементы поверх старых.
		else {BCounter=BCounter+1;}
		
	};

	void Remove(){};

	void Refresh(){   // !!!! Ошибка !!!!
		ofstream ofst(Name.c_str()); // создание потока записи в файл
		Box<Class>* Index;
		Index=Begin;
		for (;Index->Next!=NULL;){
			ofst.write(reinterpret_cast<char*>(Index-  >T),sizeof(Class));   /*Функция записывает все элементы List в файл до моментка когда Next=Null !!!! Вот на этой строчке !!!!*/
			Index=Index->Next;
		}
		ofst.close(); // закрытие потока
	}
};

void END(){};


int SwitchType(){
cout<<"With what type you whant to work? 1 - int	2 - char\n";
	int p;
	p=getch()-'0';
	switch (p)  { 

                 case 1: return 1;
					 break;
				 case 2: return 2;
					 break;
				 default: cout<<"!!!Wrong!!!\n";
					 return SwitchType();
					 break;
	}};


void Create();

template<typename T>
void SwitchInstruction(List<T>&L, Box<T>BOX[], int &BCounter){
int n;
cout<<"1 - Create   2 - Show  3 - Sort  4 - Download  5 - Remove  6 - Refresh 7 - END\n";
n=getch()-'0';
	switch (n)  { 
                 case 1:  Create();
					 break;
				 case 2:  L.Show();
					 break;
				 case 3:  L.Sort();
					 break;
				 case 4:  L.Download(BOX, BCounter);
					 break;
				 case 5:  L.Remove();
					 break;
				 case 6:  L.Refresh();
					 break;
				 case 7:  END();
					 break;
				  default:
					  cout<<"!!!Wrong!!!\n";
					  SwitchInstruction(L, BOX, BCounter);
				};
};




void WorkWithFILE(string Name){
int st=SwitchType();
if (st==1){
		cout<<"int...\n";
		Box<int>* BOX = new Box<int>[10];
		int BiCounter=0; // количество уже задействованных элементов массива
		List<int> Li;
		Li.Name=Name;
		while (1) {SwitchInstruction(Li, BOX, BiCounter);}
		  }
if (st==2){
		cout<<"char...\n";
		Box<char>* BOX = new Box<char>[10];
		int BcCounter=0; // количество уже задействованных элементов массива
		List<char> Lc;
		Lc.Name=Name;
		while (1) {SwitchInstruction(Lc, BOX, BcCounter);}
		  }

};

void Create(){
	cout<<"Creating...\nPrint file name: ";
	string Name;
	cin>>Name;
	Name+='.';
	Name+='d';
	Name+='a';
	Name+='t';
	cout<<"\nYou create file: "<<Name<<"\n";
	WorkWithFILE(Name);
	};
Цитата:
Unhandled exception at 0x10487868 (msvcp90d.dll) in FuckingKurs.exe: 0xC0000005: Access violation reading location 0x00000011.
Цитата:
Необработанные исключения на 0x10487868 (msvcp90d.dll) в FuckingKurs.exe: 0xC0000005: Нарушение прав доступа чтения расположение 0x00000011.

Ошибка в функции Refresh - метод класса List, в строчке "ofst.write(reinterpret_cast<char*> (Index- >T),sizeof(Class));"
pinkiller вне форума Ответить с цитированием
Старый 06.01.2012, 16:05   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

А ты уверен, что в том элементе, что ты записываешь, есть значение? Пройдись отладкой и посмотри, какие там значения.
MaTBeu вне форума Ответить с цитированием
Старый 06.01.2012, 16:11   #3
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

Прошелся, и даже писал над началом цикла
cout<<Index->T;
значение есть, именно то которое я предварительно записал функцией Download;
pinkiller вне форума Ответить с цитированием
Старый 06.01.2012, 16:26   #4
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

Можешь удалить или закрыть тему.
правильно писать:
Код:
ofst.write(reinterpret_cast<char*> (&(Index- >T)),sizeof(Class));
наверное... ^^
pinkiller вне форума Ответить с цитированием
Старый 06.01.2012, 17:08   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не успел написать.

ТС, правильно нашли ошибку.
вы приводили переменную в указатель, а вам же нужно преобразовывать типы указателей.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приведение/преобразование типов rommster Общие вопросы C/C++ 9 30.05.2011 14:44
приведение типов??? nikozavr C# (си шарп) 1 14.05.2011 22:29
Приведение пользовательских типов peplenko Общие вопросы C/C++ 6 18.04.2011 12:59
С - приведение типов onewho Общие вопросы C/C++ 3 21.11.2010 00:12
Приведение типов в Qt mike_tihomirov Qt и кроссплатформенное программирование С/С++ 1 19.06.2010 13:14