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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2010, 17:06   #1
Ханако Сейсин
 
Аватар для Ханако Сейсин
 
Регистрация: 01.04.2010
Сообщений: 5
По умолчанию Преобразовать текстовый файл в двоичный (C++)

Во-первых, так как это моя первая тема на форуме, всем привет.
Во-вторых, ниже описана моя проблема и я очень надеюсь, что мне здесь помогут =)
Все по порядку, сама проблема в самом конце.

Текст задания звучит так:

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

При это подразумевается, что сначала нужно эти двоичные файлы получить из текстовых. Собственно к выполнению основного задания я еще не начинал приступать из-за того, что не получается сделать преобразование. Вот мой код:

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#pragma hdrstop

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

#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused

struct student1 {
	char surname[15];
	char name[15];
	int year;
	int oc[3];
};

struct student2 {
	char surname[15];
	char name[15];
	char gender;
	int year;
};



int _tmain(int argc, _TCHAR* argv[])
{
	FILE *in, *out;

	//Преобразование текстового файла file1.txt в двоичный file1.dat
	student1 a;
	int s=sizeof(a);
	out=fopen("file1.dat", "w+b");
	if ((in=fopen("file1.txt", "r")) != NULL)
	{
		while (fgets(a.surname,15,in) != NULL)
		{
			fgets(a.name, 15, in);
			fscanf(in, "%f %f %f %f\n", a.year, a.oc[0], a.oc[1], a.oc[2]);
			fwrite(&a,s,1,out);
		}
	}
	fclose(in);
	fclose(out);


	//Преобразование текстового файла file2.txt в двоичный file2.dat
	student2 b;
	s=sizeof(b);
	out=fopen("file2.dat", "w+b");
	if ((in=fopen("file2.txt", "r")) != NULL)
	{
		while (fgets(b.surname,15,in) != NULL)
		{
			fgets(b.name, 15, in);
			fscanf(in, "%с %f\n", b.gender, b.year);
			fwrite(&b,s,1,out);
		}
	}
	fclose(in);
	fclose(out);

	return 0;
}
//---------------------------------------------------------------------------
Вот файлы, которые я пытаюсь преобразовать:
file1.txt
Код:
Ayanami        Rei            2 5 5 5
Ikari          Shinji         2 4 5 4
Langley Sohryu Asuka          2 5 5 5
Aida           Kensuke        2 4 5 5
Suzuhara       Touji          2 3 4 3
Teppelin       Nia            1 4 5 3
Ritona         Yoko           3 5 5 4
Takaya         Noriko         2 4 5 5
Koiso          Kenji          3 5 5 5
file2.txt
Код:
Ayanami        Rei            F 2001
Ikari          Shinji         M 2001
Langley Sohryu Asuka          F 2001
Aida           Kensuke        M 2001
Suzuhara       Touji          M 2001
Teppelin       Nia            F -14
Ritona         Yoko           F -14
Takaya         Noriko         F 2000
Koiso          Kenji          M 1993
При запуске выдаёт Acces Violation и создает пустые dat файлы.
Ханако Сейсин вне форума Ответить с цитированием
Старый 01.04.2010, 21:16   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

fscanf(in, "%f %f %f %f\n", a.year, a.oc[0], a.oc[1], a.oc[2]);
не соответствие типов и передавать нужно указатели

fscanf(in, "%d %d %d %d", &a.year, &a.oc[0], &a.oc[1], &a.oc[2]);
Kostia вне форума Ответить с цитированием
Старый 02.04.2010, 14:32   #3
Ханако Сейсин
 
Аватар для Ханако Сейсин
 
Регистрация: 01.04.2010
Сообщений: 5
По умолчанию

Большое спасибо! Теперь работает.
Правда результирующие файлы выглядят странно:
Цитата:
Ayanami Rei €2
anami Ikari €2 Shinji 2 4 5 4
€2 Langley Sohryu Asuka €2
ngley Sohryu Aida €2 Kensuke 2 4 5 5
€2 Suzuhara Touji €2
zuhara Teppelin €2 Nia 1 4 5 3
€2 Ritona Yoko €2
tona Takaya €2 Noriko 2 4 5 5
€2 Koiso Kenji €2
и
Цитата:
Ayanami Rei F 2001
Ikari Shinji M 2001
Langley Sohryu Asuka F 2001
hryu Aida Kensuke M 2001
Suzuhara Touji M 2001
Teppelin Nia F -14
Ritona Yoko F -14
Takaya Noriko F 2000
Koiso Kenji M 1993 Kenji
Хоть в учебнике и написано не открывать двоичные файлы в блокноте, но повторяющиеся фрагменты фамилий выглядят подозрительно. Это так и должно быть или что-то все таки не так?

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

Последний раз редактировалось Ханако Сейсин; 02.04.2010 в 14:39.
Ханако Сейсин вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как текстовый файл в формате word 2007 переделать в файл в формате ZAY JULIA Microsoft Office Word 13 09.06.2010 19:43
двоичный файл (ПАСКАЛЬ) Таня.Ку Помощь студентам 2 29.03.2010 13:45
Создать двоичный файл и записать в него n целых чисел. Нездешний Помощь студентам 3 18.10.2009 17:27
Текстовый файл. Mashul'ka Помощь студентам 1 14.05.2009 18:22
Текстовый файл в текстовый массив Kimimaru Общие вопросы C/C++ 1 02.12.2007 11:55