Osikwemen Ответов: 2

Пустая структура была записана в файл, хочу знать, правильно ли я пишу структуру.


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

Что я уже пробовал:

void writetickets()//second function called after the addcache func
{
	string park1 = "Sign Sammoric/Tickets/";
	park1 += to_string(dat.year()) + "/" + to_string(dat.month()) + "/" + to_string(dat.day());
	if (!is_directory(park1.c_str()))//checks to see if the directory to write file to exists
	{

		if (create_directories(park1.c_str()))//create the directories
		{
			park1.append("/Tickets.dat");
			ofstream file(park1.c_str(), ios::out | ios::app | ios::binary);//opens the file in binary mode
			materials t1;
			if (file.is_open())//checksto se if the file is opened before fany furthe operations
			{
				auto r = material.begin();
				for (r = material.begin();r != material.end();r++)//iterates through the vector container
				{
					file.write((char *)&r, sizeof r);
				}
				file.close();
			}

		}
	}
	else
	{
		park1 += "/Tickets.dat";
		materials t1;
		ofstream file(park1.c_str(), ios::out | ios::app | ios::binary);
		if (file.is_open())
		{
			auto r = material.begin();
			for (r = material.begin();r != material.end();r++)
			{
				file.write((char *)&r, sizeof(r));
			}
			file.close();
		}
	}
}
void addcache()//function used to add to the vector<materials> container also the first func called
{
	materials t1;
	dat = QDate::currentDate();
	strncpy(t1.name1, pickapark->currentText().toStdString().c_str(), 30);
	strncpy(t1.ticketid, edit2->displayText().toStdString().c_str(), 10);
	strncpy(t1.serial, edit1->displayText().toStdString().c_str(), 10);
	l = dat.toString().toStdString();
	strncpy(t1.date, l.c_str(), 15);
	t1.y = day1->currentText().toInt();
	t1.check = 1;
	material.push_back(t1);
}
void viewtickets()
{
	string par = "Sign Sammoric/Tickets/" + to_string(boyear->currentText().toInt()) + "/" + to_string(setmonth1(bomonth->currentText())) + "/" + to_string(boday->currentText().toInt());
	if (is_directory(par.c_str()))
	{
		materials t1;
		par.append("/Tickets.dat");
		ifstream file;
		if (!material.empty());
		material.erase(material.begin(), material.end());
		file.open(par.c_str(), ios::in | ios::binary);
		if (file.is_open())
		{
			while (file.read((char *)&t1, sizeof(t1)))
				material.push_back(t1);
		}
		file.close();
	}
}

Kevin Marois

Так в чем же твой вопрос?

Osikwemen

хотите знать, правильно ли написана структура и все ли ее содержимое записано в файл.

[no name]

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

2 Ответов

Рейтинг:
2

Jochen Arndt

Только вы можете проверить, правильно ли она написана. Мы видим только какой-то код, которого недостаточно, чтобы дать вам осмысленный ответ. Тем более, что вы не показали код, который записывается в файл.

Однако есть некоторые строки кода, которые делают довольно маловероятным, что код делает то, что вы ожидаете:

t1.y = b4->displayText().toInt();
if (isdigit(t1.y))
Используется несколько раз. t1.y вероятно, это int (потому что вы назначаете возвращаемое значение toInt()). Но isdigit() проверяет, является ли переданный символ (обработанный как int)- это цифра. Это будет верно для значений от 0x30 до 0x39 (от '0' до '9'). Таким образом, условие выполняется, когда b4->displayText() строка содержит от "48"до " 57". Это, вероятно, не то, что вы хотите.

if (!material.empty());
Не вредит, а просто ничего не делает.


Osikwemen

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

Jochen Arndt

Как уже было предложено pwasser:
Используйте шестнадцатеричный редактор для проверки содержимого файла.
Ваш файл является двоичным (содержит строки int и null). Таким образом, вы не можете показать содержимое в виде текста.

Osikwemen

большое спасибо, что я использовал D hex editor, пока не нашел способ использовать функцию записи, пока не получил то, что хотел.

Рейтинг:
0

Osikwemen

void writetickets()
{
	string park1 = "Sign Sammoric/Tickets/";
	park1 += to_string(dat.year()) + "/" + to_string(dat.month()) + "/" + to_string(dat.day());
	if (!is_directory(park1.c_str()))//checks to see if the directory to write file to exists
	{

		if (create_directories(park1.c_str()))//create the directories
		{
			park1.append("/Tickets.dat");
			ofstream file(park1.c_str(), ios::out | ios::app | ios::binary);//opens the file in binary mode
			materials t1;
			if (file.is_open())//checksto se if the file is opened before fany furthe operations
			{
				auto r = material.begin();
				for (r = material.begin();r != material.end();r++)//iterates through the vector container
				{
					file.write(reinterpret_cast<char *>(&(*r).name1), sizeof((*r).name1));
					file.write(reinterpret_cast<char *>(&(*r).ticketid), sizeof((*r).ticketid));
					file.write(reinterpret_cast<char *>(&(*r).serial), sizeof((*r).serial));
					file.write(reinterpret_cast<char *>(&(*r).date), sizeof((*r).date));
					file.write(reinterpret_cast<char *>(&(*r).y), sizeof((*r).y));
					file.write(reinterpret_cast<char *>(&(*r).check), sizeof((*r).check));
				}
				file.close();
			}

		}
	}
	else
	{
		park1 += "/Tickets.dat";
		materials t1;
		ofstream file(park1.c_str(), ios::out | ios::app | ios::binary);
		if (file.is_open())
		{
			auto r = material.begin();
			for (r = material.begin();r != material.end();r++)
			{
				file.write((char *)&r, sizeof(r));
			}
			file.close();
		}
	}
}
void addcache()
{
	materials t1;
	dat = QDate::currentDate();
	strncpy(t1.name1, pickapark->currentText().toStdString().c_str(), 30);
	strncpy(t1.ticketid, edit2->displayText().toStdString().c_str(), 10);
	strncpy(t1.serial, edit1->displayText().toStdString().c_str(), 10);
	l = dat.toString().toStdString();
	strncpy(t1.date, l.c_str(), 15);
	t1.y = day1->currentText().toInt();
	t1.check = 1;
	material.push_back(t1);
}
void viewtickets()
{
	string par = "Sign Sammoric/Tickets/" + to_string(boyear->currentText().toInt()) + "/" + to_string(setmonth1(bomonth->currentText())) + "/" + to_string(boday->currentText().toInt());
	if (is_directory(par.c_str()))
	{
		materials t1;
		par.append("/Tickets.dat");
		ifstream file;
		if (!material.empty());
		material.erase(material.begin(), material.end());
		file.open(par.c_str(), ios::in | ios::binary);
		if (file.is_open())
		{
			while (!file.fail())
			{
				file.read(reinterpret_cast<char *>(&t1.name1), sizeof(t1.name1));
				file.read(reinterpret_cast<char *>(&t1.ticketid), sizeof(t1.ticketid));
				file.read(reinterpret_cast<char *>(&t1.serial), sizeof(t1.serial));
				file.read(reinterpret_cast<char *>(&t1.date), sizeof(t1.date));
				file.read(reinterpret_cast<char *>(&t1.y), sizeof(t1.y));
				file.read(reinterpret_cast<char *>(&t1.check), sizeof(t1.check));
				material.push_back(t1);
			}
				
		}
		file.close();
	}
}


Richard Deeming

Если вы хотите обновить свой вопрос, Нажмите зеленую ссылку "улучшить вопрос" в нижней части вашего вопроса.

НЕ опубликуйте свое обновление как "решение".