powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чтение с бинарного файла
25 сообщений из 39, страница 1 из 2
Чтение с бинарного файла
    #38590367
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос по теме запись и чтение буфера с бинарного файла. Ниже приведен код, не могу разобраться в чем ошибка, почему моя проверка не работает. Помогите пожалуйста.

.срр
SmartStructBuffer::SmartStructBuffer(int strSize /*=5*/)
{
const int MIN_BUF_SIZE = sizeof(Daten);
m_size = 0; // Size in Bytes
m_maxSize = (strSize < MIN_BUF_SIZE ? MIN_BUF_SIZE :strSize);
m_buff = new char [m_maxSize];
}
SmartStructBuffer::SmartStructBuffer (const SmartStructBuffer& other) // Kopie Konstruktor
{
m_maxSize = other.GetmaxSize();
m_size = other.GetSize();
m_buff = new char [m_maxSize];
memcpy(m_buff, other.GetRawBuffer(), m_size);
}
Daten SmartStructBuffer::operator [](int p)
{
if((p +1) * sizeof(Daten) >= m_size + 1 || p < 0 )
throw out_of_range ("offset ist out of range");
else
{
Daten *pDaten;
pDaten = (Daten*)(m_buff + p * sizeof(Daten));

return *pDaten;
}
}
SmartStructBuffer & SmartStructBuffer::operator = (const SmartStructBuffer & other)
{
for(int i = 0; i<m_size; i++)
m_buff[i] = other.m_buff[i];
return *this;
}
SmartStructBuffer::~SmartStructBuffer(void)
{
delete [] m_buff;
}
int SmartStructBuffer::GetSize() const
{
return m_size; // wie viel Bytes belegt
}
int SmartStructBuffer::GetmaxSize() const
{
return m_maxSize; // letzte Element in Array
}
bool SmartStructBuffer::WriteToFile(const char* &filename)
{
fstream myFile( filename,ios::binary | ios::out);
if(!myFile.is_open())
{
cerr << "Fehler beim Öffnen der Datei " << filename << endl;
return false;
}
else
{
myFile.write((char*)&m_maxSize, sizeof(m_maxSize));
myFile.write((char*)&m_size, sizeof(m_size));
myFile.write(m_buff, sizeof(m_buff));
}
myFile.close();
return true;

}
bool SmartStructBuffer::ReadFromFile(const char* &filename)
{
fstream myFile (filename, ios::binary | ios::in);
if(!myFile.is_open())
{
cerr << "Fehler beim Öffnen der Datei " << filename << endl;
return false;
}
else
{
myFile.read((char*)&m_maxSize, sizeof(m_maxSize));
myFile.read((char*)&m_size, sizeof(m_size));
delete[] m_buff;
m_buff = new char [m_maxSize];
m_buff = new char [m_size];

myFile.read(m_buff, sizeof(m_buff));
}[SRC c++][/SRC]
myFile.close();
return true;

}

Структура:

struct Daten
{
int i;
float f;
double d;
char c;

Daten(int i )
{
this->i = i;
f = i;
d = i;
}
bool operator==(const Daten& a) const
{
return (this->i==a.i && this->f == a.f && this->d == a.d && this->c == a.c);
}
};



Моя проверка:

int main()
{
SmartStructBuffer sb(sizeof(Daten));

const int IT = 5;
for(int i = 0; i < IT; i++)
{
Daten s(i);
sb.Add(s);
}
const char* pFILENAME = "D:\\01.bin";
sb.WriteToFile(pFILENAME);

SmartStructBuffer sb2(123);
sb2.ReadFromFile(pFILENAME);
assert(sb.GetmaxSize() == sb2.GetmaxSize());
for(int i =0; i < sb2.GetSize(); i++)
{
assert(sb[i] == sb2[i]);
}
return 0;
}
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590412
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988,

надо как бы тоже объявление SmartStructBuffer
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590415
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
#include "stdafx.h"
#include "SmartStructBuffer.h"
#include<iostream>
#include <assert.h>
#include <stdexcept>
#include "Daten.h"
#include <fstream>

using namespace std;



SmartStructBuffer::SmartStructBuffer(int strSize /*=5*/)
{
	const int MIN_BUF_SIZE = sizeof(Daten);
	m_size = 0; // Size in Bytes
	m_maxSize = (strSize < MIN_BUF_SIZE ? MIN_BUF_SIZE :strSize); // if maxSz ist < als sz dann MaxSize = grцЯter von zwei 
	m_buff = new char [m_maxSize];
}
SmartStructBuffer::SmartStructBuffer (const SmartStructBuffer& other) // Kopie Konstruktor
{
	m_maxSize = other.GetmaxSize();
	m_size = other.GetSize();
	m_buff = new char [m_maxSize];
	memcpy(m_buff, other.GetRawBuffer(), m_size);
}
Daten SmartStructBuffer::operator [](int p)
{
	if((p +1) * sizeof(Daten) >= m_size + 1 ||  p < 0 )
		throw out_of_range ("offset ist out of range");
	else
	{
		Daten *pDaten;
		pDaten = (Daten*)(m_buff + p * sizeof(Daten));

		return *pDaten;	
	}
}
SmartStructBuffer & SmartStructBuffer::operator = (const SmartStructBuffer & other)
{
	for(int i = 0; i<m_size; i++)
		m_buff[i] = other.m_buff[i];
	return *this;
}
SmartStructBuffer::~SmartStructBuffer(void)
{
	delete [] m_buff;
}
int SmartStructBuffer::GetSize() const
{
	return m_size; // wie viel Bytes belegt
}
int SmartStructBuffer::GetmaxSize() const
{
	return m_maxSize; // letzte Element in Array
}
Daten SmartStructBuffer::getAtPos(int p)
{
	if((p +1) * sizeof(Daten) >= m_size + 1 ||  p < 0 )
		throw out_of_range ("offset ist out of range");
	else
	{
		Daten *pDaten;
		pDaten = (Daten*)(m_buff + p * sizeof(Daten));

		return *pDaten;	
	}
}
void SmartStructBuffer::IncreaseSize(int newSize)
{
	m_maxSize = m_size + newSize; // Neue grцЯe von m_buff
	char *newArray = new char[m_maxSize]; // Neue Array erstellen
	memcpy(newArray,m_buff,m_size);
	//for(int i = 0; i<m_size; i++)
	//{
	//	newArray[i]= m_buff[i]  ; // Kopie von Elementen
	//	}
	delete [] m_buff;
	m_buff = newArray;
}
void SmartStructBuffer::Add(const Daten& data)
{
	//Habe ich genug Platz fьr eine Struktur?
	if(m_maxSize - m_size < sizeof(Daten))
	{
		//wenn nicht, dann mindestens um die GrцЯe der Struktur vergrцЯen
		IncreaseSize(sizeof(Daten)*3);

		char *newArray = new char[m_maxSize]; // Neue Array erstellen
		memcpy(newArray,m_buff,m_size);
		delete [] m_buff;
		m_buff = newArray;
	}

	memcpy(m_buff + m_size, (char*)&data, sizeof(Daten));
	m_size = m_size + sizeof(Daten);
	//for (int i = 0; i< sizeof(Daten); i++)
	//{
	//(*m_buff + m_size +i)= *((char*)data+i) ; // Element einfьgen am Ende Array
	//}
}
void SmartStructBuffer::Clear()
{
	m_size = 0;
}
void SmartStructBuffer::DatenAnPosErsetzen(int p, const Daten &data)
{
	if((p +1) * sizeof(Daten) >= m_size + 1 ||  p < 0 )
		throw out_of_range ("offset ist out of range");
	else
		Daten *pDaten;
	Daten *pDaten = (Daten*)(m_buff + p*sizeof(Daten));
	*pDaten = data;
}
void SmartStructBuffer::InsertAtPos(int p, const Daten &data)
{
	Daten daten(-1); 

	Daten *ptr = (Daten*)(m_buff); // Prьfung der Daten
	if(m_maxSize < m_size + sizeof(Daten)) // Wenn buff zu klein ist
	{
		IncreaseSize(m_size + sizeof(Daten)); // m_buff vergrцЯern
	}
	p = p*sizeof(Daten);

	memmove(m_buff + p + sizeof(Daten), m_buff + p, m_size - p);

	//for(int i =  m_size-1; i >= p ; i-- ) // von rechts  bis position
	//{
	//	*(m_buff+i+ sizeof(Daten)) = *(m_buff+i) ; // Verschiebung
	//}
	*(Daten*)(m_buff + p) = data; // data auf position speichern
	m_size = m_size + sizeof(Daten); // m_size vergrцЯen
}
void  SmartStructBuffer::RemoveAtPos(int p)
{
	if((p +1) * sizeof(Daten) >= m_size + 1 ||  p < 0 )
		throw out_of_range ("offset ist out of range");

	p = p*sizeof(Daten);
	memmove(m_buff + p,m_buff + p + sizeof(Daten), m_size - p - sizeof(Daten));
	//for(int i = p; i < m_size-1; i++) // von p nach rechts
	//{
	//	m_buff[i] = m_buff[i + sizeof(Daten)];
	//}
	m_size = m_size - sizeof(Daten);
}

std::ostream& operator << (std::ostream& os,const Daten& data)
{
	os << " Struktur: \n" <<" int " <<data.i <<", \n" << " float "<< data.f<< ", \n" <<" double " << data.d << ", \n" <<" char " <<data.c << std::endl;

	return os;
}
bool SmartStructBuffer::WriteToFile(const char* &filename)
{
	fstream myFile( filename,ios::binary | ios::out);
	if(!myFile.is_open())
	{
		cerr << "Fehler beim &#214;ffnen der Datei " << filename << endl;
		return false;
	}
	else
	{
		myFile.write((char*)&m_maxSize, sizeof(m_maxSize));
		myFile.write((char*)&m_size, sizeof(m_size));
		myFile.write(m_buff, sizeof(m_buff));
	}
	myFile.close();
	return true;

}
bool SmartStructBuffer::ReadFromFile(const char* &filename)
{
	fstream myFile (filename, ios::binary | ios::in);
	if(!myFile.is_open())
	{
		cerr << "Fehler beim &#214;ffnen der Datei " << filename << endl;
		return false;
	}
	else
	{
		myFile.read((char*)&m_maxSize, sizeof(m_maxSize));
		myFile.read((char*)&m_size, sizeof(m_size));
		delete[] m_buff;
		m_buff = new char [m_maxSize];

		char *newArray = new char[m_maxSize]; // Neue Array erstellen
		memcpy(newArray,m_buff,m_size);
		delete [] m_buff;
		m_buff = newArray;

		myFile.read(m_buff, sizeof(m_buff));
	}
	myFile.close();
	return true;

}
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590417
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
int main()
{
	SmartStructBuffer sb(sizeof(Daten));

	const int IT = 5;
	for(int i = 0; i < IT; i++)
	{
		Daten s(i);
		sb.Add(s);
	}
	const char* pFILENAME = "D:\\01.bin";
	sb.WriteToFile(pFILENAME);
	
	SmartStructBuffer sb2(123);
	sb2.ReadFromFile(pFILENAME);	
	assert(sb.GetmaxSize() == sb2.GetmaxSize());
	for(int i =0; i < sb2.GetSize(); i++)
	{
		assert(sb[i] == sb2[i]);
	}
	return 0;
}
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590424
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не работает вот эта часть

assert(sb[i] == sb2[i]);

Помогите пожалуйста
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590452
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988,

Так убери assert, будет работать
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590462
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Натренировал свой хрустальный шар. Даже можно сказать, хрустальные шары, если вы понимаете юмор.

Ошибка тут.
Код: plaintext
1.
myFile.write(m_buff, sizeof(m_buff));
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590629
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, а конкретно как это исправить?
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590651
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988,

sizeof правильный поставь.
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590681
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
какой может быть правильный если мне надо записать размер буфера туда
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590684
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Причина я думаю в

bool SmartStructBuffer::ReadFromFile(const char* &filename)

там надо правильно считать обьект
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590687
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988Причина я думаю в

bool SmartStructBuffer::ReadFromFile(const char* &filename)

там надо правильно считать обьект

Да, и там тоже размер неправильный.
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590688
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988,

Всё, топик можно закрывать ?
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590738
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет, я не могу разобраться как же будет правильно, помогите пожалуйста
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590741
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и дело не в размере, а в том что содержание обьектов не соответствует. как это исправить?
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590762
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988как это исправить?
Сначала проверь правильно ли оно записывается в файл. Если неправильно - отлаживай
процедуру записи по шагам, проверяя все значения пока не найдёшь место, где то, что ты о
ней воображаешь, начинает расходиться с реальностью.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590771
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ, а как именно можно проверить правильно ли в файле записано. Ведь при открытии в файле ничего не видно.
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590806
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что нужно дописать в функции bool SmartStructBuffer::ReadFromFile(const char* &filename) чтобы второй обьект был равным первому по содержанию?
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590908
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988Спасибо за ответ, а как именно можно проверить правильно ли в файле записано. Ведь при открытии в файле ничего не видно.

less

hexdump
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590963
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никто не может найти ошибку и помочь? Задание как мне сказали несложное, я только учусь
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590973
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988при открытии в файле ничего не видно.
Открывай HEX-редактором.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38590985
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988Никто не может найти ошибку и помочь? Задание как мне сказали несложное,
я только учусь
Умение находить ошибки - важнейшее для программиста. Так что учись ему в первую очередь. А
если тебе прямо ткнуть пальцем, пропадёт весь педагогический эффект.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38591086
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все верно, но нельзя же вечно над одной проблемой биться, так жизни не хватит это освоить)))) Я думала для этого и есть форумы, чтобы спрашивать
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38591091
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chicito1988Все верно, но нельзя же вечно над одной проблемой биться
Можно. Самые хитрые баги от меня скрывались годами. Тебе же достаточно одного-двух
пошаговых проходов. Это не займёт больше одного дня.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение с бинарного файла
    #38591115
chicito1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вот так переписала, но у меня теперь другая ошибка с размером, выход за его пределы. Помогите пожалуйста

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
bool SmartStructBuffer::WriteToFile(const char* &filename)
{
	fstream myFile( filename,ios::binary | ios::out);
	if(!myFile.is_open())
	{
		cerr << "Fehler beim &#214;ffnen der Datei " << filename << endl;
		return false;
	}
	else
	{
		myFile.write((char*)&m_maxSize, sizeof(m_maxSize));
		myFile.write((char*)&m_size, sizeof(m_size));
	        myFile.write((char*)&m_buff, sizeof(m_buff));
	}
	myFile.close();
	return true;

}
bool SmartStructBuffer::ReadFromFile(const char* &filename)
{
	fstream myFile (filename, ios::binary | ios::in);
	if(!myFile.is_open())
	{
		cerr << "Fehler beim &#214;ffnen der Datei " << filename << endl;
		return false;
	}
	else
	{
		myFile.read((char*)&m_maxSize, sizeof(m_maxSize));
		myFile.read((char*)&m_size, sizeof(m_size));

		delete[] m_buff;

		m_buff = new char [m_maxSize];
		m_buff = new char[m_size];

		memcpy(m_buff, &m_buff, sizeof(m_buff) );

		myFile.read((char*)&m_buff, sizeof(m_buff));
	}
	myFile.close();
	return true;
}
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чтение с бинарного файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]