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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2011, 13:33   #1
hp5
 
Регистрация: 06.06.2011
Сообщений: 4
Восклицание Создание двоичного файла

Такая заморочка,нужно создать двоичный файл,вроде сделал все по правилам,но преподу не нравится,то что последовательность цифр в двоичном файле не должна отображаться в виде цифр,а должна отображаться в виде символов(что-то вроде когда не подходят кодировки)
вот условие задачи :
Дан двоичный файл, содержащий расположенные по строкам M двумерных
вещественных массивов, каждый размером L X K ( L строк, K строк ).
Каждый элемент массива помещен в отдельную запись.
Составить программу, формирующую этот файл (например, 3 массива
размером 2 на 3).
Сформировать из этого файла другой, литерный файл, в котором кажда
запись представляет собой столбец двумерного массива.


Вот мой код
Код:
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <locale>
#include <iterator>
#include <conio.h>
#include <string>
#include <vector>
#include <algorithm>
#include <time.h>

using namespace std;

// объвление констант;
#define M 3
#define L 2
#define K 3
#define MAX_VALUE 100

// переопределение типов;
typedef vector<vector<double> > matrix_2;
typedef matrix_2::iterator m2Iter;
typedef vector<matrix_2> matrix_3;
typedef matrix_3::iterator m3Iter;

int main()
{
	// делаем рандом зависимым от времени;
	srand(static_cast<unsigned>(time(NULL)));
	// выставляем вывод русского текста в консоли;
	setlocale(LC_ALL, "Russian");

	// запрашиваем у пользователя имя создаваемого файла;
	cout << "Введите имя создаваемого файла" << endl;
	string fileName;
	cin >> fileName;

	// первая часть задания - создание бинарного файла с 3х-мерной матрицей;
	{
		// создание файла для записи в бинарном режиме;
		ofstream file(fileName.c_str(), ios::trunc | ios::binary);
		// если почемк-то не удалось создать файл, то оповещаем пользователя и выходим из приложения;
		if (file.fail())
		{
			cout << "Невозможно создать файл " << fileName << endl;
			_getch();
			return EXIT_FAILURE;
		}

		// создание трехмерной матрицы;
		matrix_3 v(M, matrix_2(L, vector<double>(K)));

		// сгенерируем созданную матрицу  и сразу выводим ее в файл;
		for (m3Iter i = v.begin(), end = v.end(); i != end; ++i)
		{
			for (m2Iter j = i->begin(), end = i->end(); j != end; ++j)
				for (vector<double>::iterator k = j->begin(), end = j->end(); k != end; ++k)
					file << (*k = rand() % MAX_VALUE) << " ";
			file << endl;
		}
		// закрываем файл;
		file.close();
	}
	
	// оповещение пользователя о том, что требуемый файл создан;
	cout << "Файл " << fileName << "создан " << endl << endl;

	// вторая часть задания - создание литерного файла основе предыдущего;
	{
		// открываем первый файл на чтение;
		ifstream ifile(fileName.c_str(), ios::binary);

		// запрашиваем имя второго файла;
		cout << "Введите имя второго файла" << endl;
		cin >> fileName;
		ofstream ofile(fileName.c_str(), ios::trunc);

		// если не получилось создать файл, то оповещаем пользователя и выходим из приложения;
		if (ofile.fail())
		{
			cout << "Не удалось создать файл " << fileName << endl;
			_getch();
			return EXIT_FAILURE;
		}

		// создадим 3х-мерную матрицу для считывания данных;
		matrix_3 v(M, matrix_2(L, vector<double>(K)));

		// считаем исходные данные в созданную матрицу;
		for (m3Iter i = v.begin(), end = v.end(); i != end; ++i)
			for (m2Iter j = i->begin(), end = i->end(); j != end; ++j)
				for (vector<double>::iterator k = j->begin(), end = j->end(); k != end; ++k)
					ifile >> *k;
		// закрываем файл;
		ifile.close();

		// заполним второй файл (каждая запись - столбец двумерной матрицы);
		for (m3Iter i = v.begin(), end = v.end(); i != end; ++i)
		{
			vector<double> tmp(L);
			for (size_t k = 0; k < K; ++k)
			{
				vector<double> tmp(L);
				for (size_t j = 0; j < L; ++j)
				{
					tmp[j] = i->operator[](j)[k];
					ofile << i->operator[](j)[k] << " ";
				}
				
				ofile << " ";
			}
			ofile << endl;
		}
		// закрываем файл;
		ofile.close();
		// оповезщение пользователя о создании нового файла;
		cout << "Файл " << fileName << " создан" << endl;
	}

	_getch();
	return EXIT_SUCCESS;
}
hp5 вне форума Ответить с цитированием
Старый 19.06.2011, 14:32   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
file << endl;
ifile >> *k;
это текстовый вывод\вывод! используй read\write
counter вне форума Ответить с цитированием
Старый 19.06.2011, 19:47   #3
hp5
 
Регистрация: 06.06.2011
Сообщений: 4
По умолчанию

хм вроде не подходит..ошибку выводит
hp5 вне форума Ответить с цитированием
Старый 20.06.2011, 16:54   #4
hp5
 
Регистрация: 06.06.2011
Сообщений: 4
По умолчанию

Цитата:
counter
fread/fwrite или может быть file.read/file.write или как вообще?
hp5 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создание файла на С klykovka Общие вопросы C/C++ 6 20.04.2010 12:07
Создание файла если такого файла нету Shaitan63 Помощь студентам 14 10.04.2010 20:39
Чтение из двоичного файла. С++ 15student89 Помощь студентам 0 16.01.2010 17:25
Открытие файла и создание графика на основе чисел из файла Simon..14 Общие вопросы C/C++ 8 09.06.2009 10:18