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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2012, 21:11   #1
eymar
Пользователь
 
Регистрация: 23.09.2012
Сообщений: 17
По умолчанию Проблема с бинарным файлом

Здравствуйте! Передо мной поставлена задача написать функцию, которая осуществляет первоначальное заполнение бинарного файла Scaners.dat из текстового файла Scaners.csv. Формат .csv(Comma Separated Values) предполагает, что каждой строке файла хранится одна запись, а ее поля отделяются друг от друга символом “;”.
Например,
HP;JetScan;2007;959.99;210;297;300
ASUS;AsScan;2009;299.99;210;297;100
Примечание. Пртотип функции “извлекающий ” одну запись м.б. таким:

struct SCAN_INFO* get_rec(char *csv_line);

Вот код функций:

Код:
SCAN_INFO* get_rec(char *csv_line){
	SCAN_INFO *temp;
	char strings[7][50];
	int i,j,k;

	temp=(SCAN_INFO*)malloc(sizeof(SCAN_INFO));
	j=0;
	k=0;
	for(i=0;i<=strlen(csv_line); i++){
		if((csv_line[i]!=';')&&(csv_line!="\0")){
			strings[j][k]=csv_line[i];
			k++;
		} else{
			strings[j][k]='\0';
			j++;
			k=0;
		}
	}

	for(i=0; i<=strlen(strings[0]); i++){
		temp->manufacturer[i]=strings[0][i];	
	}



	for(i=0; i<=strlen(strings[1]); i++){
		temp->model[i]=strings[1][i];
	}

	temp->year = atoi(strings[2]);
	temp->price =(float)atof(strings[3]);
	temp->x_size = atoi(strings[4]);
	temp->y_size = atoi(strings[5]);
	temp->optr = atoi(strings[6]);

	 return temp;

}

void inp_bin_file(char*outfile, char*inpfile){
	char ch=NULL;
	char *string;
	int count=0;
	SCAN_INFO *struc;
	FILE *out,*inp;
	out=fopen(outfile,"r");
	inp=fopen(inpfile,"wb");
	struc=(SCAN_INFO*)malloc(sizeof(SCAN_INFO));
	while(!feof(out)){
		string=(char*)malloc(sizeof(char)*50);
		fgets(string,50,out);
		struc=get_rec(string);
		fwrite(struc, sizeof(SCAN_INFO), 1, inp);	
		fwrite(struc->manufacturer, (sizeof(char)*strlen(struc->manufacturer)),1,inp);
		fwrite(struc->model, (sizeof(char)*strlen(struc->model)),1,inp);
		fwrite(&struc->year, sizeof(int),1,inp);
		fwrite(&struc->price, sizeof(float),1,inp);
		fwrite(&struc->x_size, sizeof(int),1,inp);
		fwrite(&struc->y_size, sizeof(int),1,inp);
		fwrite(&struc->optr , sizeof(int),1,inp); 
		count++;
		free(string);

	}

	rewind(inp);
	fwrite(&count, sizeof(int),1,inp);

	
}
Сами функции работают, но вот если открыть файл с результатом, т.е. бинарный файл Scanners.dat, то вижу вот такую картину:

 ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННJetScan7 ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН НННННННННННННННЧ \яoDТ ) , HPJetScan7Ч \яoDТ ) , ASUS ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН НННННННННННННННННAsScan9 ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННЩ ёю•CТ ) d ASUSAsScan9Щ ёю•CТ ) d HP ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН НННННННННННННННННННLaserScan9 ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН НННННННННННННЩ \яoDТ ) d HPLaserScan9Щ \яoDТ ) d ASUS ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН НННННННННННННННННAsScan7 ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННЧ \яyDТ ) , ASUSAsScan7Ч \яyDТ ) , Dell ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН НННННННННННННННННDellScan1 ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННЦ \яyDТ ) И DellDellScan1Ц \яyDТ ) И Dell ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН НННННННННННННННННDellScan2 ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННХ \яyDТ ) – DellDellScan2Х \яyDТ ) – ННННННННННННННННННННННННННННННННННН НННННННННННННННээээЭЭѓS^z
ъ ННННННННННННННННННННННННННННННННННН НННННННННННННННННННННННННННННээээЭЭ ѓS^z
ъ ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННННННННННННННННННННННННННН ННННННННННН ННННННННННННННННННННННННННННННННННН НННННННННННННННээээЭЭѓS^z
ъээээЭЭѓS^z
ъ

Не могу понять откуда берутся лишние символы, если исходный файл выглядит так:

HP;JetScan7;2007;959.99;210;297;300
ASUS;AsScan9;2009;299.99;210;297;10 0
HP;LaserScan9;2009;959.99;210;297;1 00
ASUS;AsScan7;2007;999.99;210;297;30 0
Dell;DellScan1;2006;999.99;210;297; 200
Dell;DellScan2;2005;999.99;210;297; 150


Спасибо большое!
eymar вне форума Ответить с цитированием
Старый 30.11.2012, 00:22   #2
crymchanin
Пользователь
 
Аватар для crymchanin
 
Регистрация: 01.02.2012
Сообщений: 84
По умолчанию

Количество мусора в бинарном файле == количеству элементов в массиве char после '\0', так как делая так:
Код:
fwrite(struc, sizeof(SCAN_INFO), 1, inp);
вы записываете все, что есть в структуре. Нужно просто выполнить то, что ниже:
Код:
fwrite(struc->manufacturer, (sizeof(char)*strlen(struc->manufacturer)),1,inp);
fwrite(struc->model, (sizeof(char)*strlen(struc->model)),1,inp);
fwrite(&struc->year, sizeof(int),1,inp);
fwrite(&struc->price, sizeof(float),1,inp);
fwrite(&struc->x_size, sizeof(int),1,inp);
fwrite(&struc->y_size, sizeof(int),1,inp);
fwrite(&struc->optr , sizeof(int),1,inp);
crymchanin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с бинарным файлом. ololo666 Общие вопросы C/C++ 0 06.06.2012 11:26
С++ работа с бинарным файлом Voldemort93 Помощь студентам 0 09.11.2011 19:03
Работа с бинарным файлом rus_phantom Общие вопросы C/C++ 4 08.11.2011 22:05
Работа с бинарным файлом (С) madmonk Помощь студентам 4 20.11.2010 20:58
Проблема с бинарным файлом melodeen12 Операционные системы общие вопросы 6 02.08.2010 01:15