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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2011, 04:39   #1
Shepard90
 
Регистрация: 16.12.2010
Сообщений: 3
По умолчанию запись в бинарный файл

По заданию требуется организовать ввод данных типа структуры в бинарных файл , в соответствии с позицией, задаваемой пользователем. При этом пропуски между данными в файле заполняется нулями.
Код:
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <vector>
#include "conio.h"
using namespace std;

struct scan_info{
char model[25]; // наименование модели 25 байт
int price; // цена 4 байта
double x_size; // горизонтальный размер области сканирования 8 байт
double y_size; // вертикальный размер области сканирования 8 байт
int optr; // оптическое разрешение 4 байта
int grey; // число градаций серого 4 байта
bool YesData; //левая переменная 1 байт
};//54 байта

void InBinFile(char * FileName, vector<scan_info> mass, short Count);
vector<scan_info> insert(int position,vector<scan_info> mass,scan_info *Data);
void SetNull(scan_info *Data);


int _tmain(int argc, _TCHAR* argv[])
{
	vector<scan_info> Arr;
	setlocale(LC_ALL, "Rus");
	short count=0;
	int position;
	char FileName[80];
	int choice;
	cout<<"Введите имя файла"<<endl;
	cin>>FileName;
	cout<<"Выберите действие: 1-Добавить блок данных, 2-Выход"<<endl;
	cin>>choice;
	while(choice==1) //заполняем структуру
	{
				count=count+1;
				scan_info* MyScan=new scan_info;
				cout<<"Модель: "<<endl;
				cin>>MyScan->model;
				cout<<"Цена: "<<endl;
				cin>>MyScan->price;
				cout<<"Длина: "<<endl;
				cin>>MyScan->x_size;
				cout<<"Ширина: "<<endl;
				cin>>MyScan->y_size;
				cout<<"Оптическое разрешение: "<<endl;
				cin>>MyScan->optr;
				cout<<"Число градаций серого: "<<endl;
				cin>>MyScan->grey;
				cout<<"Введите позицию в бинарном файле, куда будет помещен блок данных: ";
				MyScan->YesData=true;
				cin>>position;
				Arr=insert(position,Arr,MyScan);
				//Arr.push_back(*MyScan);
				cout<<"Выберите действие: 1-Добавить блок данных, 2-Выход"<<endl;
				cin>>choice;
	}
	InBinFile(FileName,Arr,count);
}

void InBinFile(char * FileName, vector<scan_info> mass, short Count)//запись в файл
{
	ofstream fout(FileName,ios::binary);
	if(!fout)
	{
		cout<<"Unable to open "<<FileName<<" for writing.\n";
		return;
	}
	fout<<Count<<endl;
	vector<scan_info>::iterator in=mass.begin();
	while(in!=mass.end())
	{
		//fileout.write((char*)&Count,sizeof Count);
		fout.write((char *)&in,sizeof(scan_info));
		++in;
	}
	fout.close();

}

void SetNull(scan_info *Data)//обнуление полей структуры
{
	for(int i=0;i<25;i++)
		Data->model[i]=0;
	Data->price=0;
	Data->grey=0;
	Data->optr=0;
	Data->x_size=0;
	Data->y_size=0;
	Data->YesData=false;
}

vector<scan_info> insert(int position,vector<scan_info> mass,scan_info *Data)//заносим данные в вектор
{
	int i=0;
	int size=mass.size();
	scan_info* NullScan=new scan_info;
	SetNull(NullScan);
	if(size<=position)
	{
		while(i!=position-size)
		{
			mass.push_back(*NullScan);
			i++;
			
		}
		mass.push_back(*Data);
	}
	
	else
	{
		mass.at(position)=*Data;
	}
	return mass;
}
Проблема возникает именно на выводе в файл. В результате в нем оказывается что-то совершенно не то(не нулей, не вводимых данных). Хотя вектор верно заполняется. Может я write как-то неправильно использую или экземпляр ofstream не так создаю.

Подскажите плз в чем косяк-то или я чет не догоняю может

Последний раз редактировалось Shepard90; 28.06.2011 в 04:44.
Shepard90 вне форума Ответить с цитированием
Старый 28.06.2011, 07:34   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

В функции InBinFile() вам, скорее всего, нужно записывать не адрес элемента, а его значение. И зачем вы пытаетесь привести типа структуры к char* я тоже не понял
Код:
fout.write(*in, sizeof(scan_info));
А по поводу читабельности файла - как вы пытаетесь его проверить? Просто открыть файл в блокноте? Так ничего ничего читаться не должно, т.к. вы записываете в бинарном режиме. Нужно либо писать в своей программе функцию для чтения файла, либо записывать в текстовом режиме, отдельно каждое поле структуры, тогда файл можно будет прочитать в простом текстовом редакторе
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 28.06.2011, 08:59   #3
Shepard90
 
Регистрация: 16.12.2010
Сообщений: 3
По умолчанию

с помощью far'a смотрел шестнадцатиричный код бин-файла
Спасибо за помощь!
И у write первый параметр-указатель на строку символов, поэтому char.
Но с адресом я действительно лажанул

Последний раз редактировалось Shepard90; 28.06.2011 в 09:58.
Shepard90 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарный файл Хитман Помощь студентам 1 27.03.2011 19:04
с++ запись в бинарный файл ofstream::write Farrel Общие вопросы C/C++ 1 25.11.2010 00:19
Чтение и запись структуры в бинарный файл Bed Alice Общие вопросы C/C++ 1 09.11.2010 21:17
Считывание и запись структур в бинарный файл TheKnyazz Общие вопросы C/C++ 7 10.11.2009 13:47
запись классов в бинарный файл Feannewedd Общие вопросы C/C++ 6 29.06.2009 10:11