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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 00:36   #1
Aerial
Пользователь
 
Аватар для Aerial
 
Регистрация: 12.04.2010
Сообщений: 17
Восклицание Повреждение данных при записи в середину бинарного файла

Задание:
Код:
/*	В середину двоичного файла целого типа записать элементы этого файла, меньшие числа, введенного с клавиатуры.	*/
Проблема при записи в середину, оставшиеся числа повреждаются.
Никак не могу понять почему, возможно из-за неправильного перевода указателя записи, но не вижу ошибки.

P.S. во время отладки,возникали посторонние проблемы, наиболее непонятная мне - ошибка при попытке создать файл.
Код:
        //Вот тут
        fstream st("A.dat",ios::out|ios::binary|ios::in);
	if( !st ){
		cerr<<"ERROR!!!";
		exit(1);
	}
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <time.h>
using namespace std;
int main()
{
	time_t t;
	srand(time(&t));
	setlocale(LC_ALL,"RUSSIAN");
	int value = 0;
	
		int nu = 0;
		cout<<"Введите число: "; cin >> nu;

	fstream st("A.dat",ios::out|ios::binary|ios::in);
	if( !st ){
		cerr<<"ERROR!!!";
		exit(1);
	}
	else{
		const int n = 10;
		int A[n], count = 0;
		for(int i=0;i<n;i++)
		{	
			value = rand()%5;
			if (value < nu)
				A[count++] = value;
			st.write(reinterpret_cast<char*>(&value), sizeof(int));
		}
		//выводим на экран, что у нас получилось
		//переводим на начало файла указатель чтения
		st.seekg(0,ios::beg);
		for(int i=0;i<n;i++)
		{	
			st.read(reinterpret_cast<char*>(&value), sizeof(int));
			cout << value << ' ';
		}
		cout<<endl;

		cout<<"\nЧисла записаны успешно. Начинаем выполнение задачи%)\n";

		//переводим указатель записи в середину

		st.seekp(sizeof(int)*n/2,ios::beg);
		int value = 0;
		for(int i=0;i<count;i++)
		{	
			value = A[i];
			st.write(reinterpret_cast<char*>(&value), sizeof(int));
		}
		cout<<"\nЗадача выполнена.\n";
		//переводим на начало файла указатель чтения
		st.seekg(0,ios::beg);
		for(int i=0;i<(n+count);i++)
		{	
			st.read(reinterpret_cast<char*>(&value), sizeof(int));
			cout << value << ' ';
		}
		cout<<endl;
		st.close();
	}
	system("PAUSE");
	return 0;
}
Aerial вне форума Ответить с цитированием
Старый 01.12.2011, 19:31   #2
Kingofc++
Новичок
Джуниор
 
Регистрация: 01.12.2011
Сообщений: 2
По умолчанию

Код:
//#include <stdafx.h>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <time.h>
using namespace std;
int main()
{
	time_t t;
	srand(time(&t));
	setlocale(LC_ALL,"RUSSIAN");
	int value = 0;//это типо текущее значение
	
	int nu = 0; //это типо число, которое мы вставляем
		cout<<"Введите число: "; cin >> nu;// ну это понятно
		//ostream file("A.dat");
		ofstream("A.dat",ios::out|ios::binary);//это меня спасло блеать fuck yeah

		fstream st("A.dat",ios::out|ios::binary|ios::in);
	if( !st ){
		cerr<<"ERROR!!!";
		exit(1);
	}
	else{
		const int n = 10;
		int A[n];//хз что это 
		int count = 0;//видимо номер текущего элемента
		for(int i=0;i<n;i++)
		{	
			value = rand()%10;
			//A[i]=rand()%10;
			//cout<<A[i]<<' ';
			if (value < nu)
				A[count++] = value;
			st.write(reinterpret_cast<char*>(&value), sizeof(int));
		}
		//выводим на экран, что у нас получилось
		//переводим на начало файла указатель чтения
		st.seekg(0,ios::beg);
		for(int i=0;i<n;i++)
		{	
			st.read(reinterpret_cast<char*>(&value), sizeof(int));
			cout << value << ' ';
		}
		cout<<endl;

		cout<<"\nЧисла записаны успешно. Начинаем выполнение задачи%)\n";

		//переводим указатель записи в середину

		st.seekp(sizeof(int)*n/2,ios::beg);
		int value=0 ;
		for(int i=0;i<count;i++)
		{	
			value = A[i];
			st.write(reinterpret_cast<char*>(&value), sizeof(int));
		}
		cout<<"\nЗадача выполнена.\n";
		//переводим на начало файла указатель чтения
		st.seekg(0,ios::beg);
		for(int i=0;i<(n+count);i++)
		{	
			st.read(reinterpret_cast<char*>(&value), sizeof(int));
			cout << value << ' ';
		}
		cout<<endl;
		st.close();
	}
	system("PAUSE");
	return 0;
}
Kingofc++ вне форума Ответить с цитированием
Старый 01.12.2011, 19:32   #3
Kingofc++
Новичок
Джуниор
 
Регистрация: 01.12.2011
Сообщений: 2
По умолчанию

Только тут еще проблема с дописыванием оставшихся чисел, почему-то он записывает несколько раз последнее
Kingofc++ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при чтении из бинарного файла twiss Помощь студентам 0 02.10.2010 00:04
Запись в середину файла newkobra Общие вопросы C/C++ 12 22.03.2010 22:35
проблема при выводе с бинарного файла... xVxSeRGxVx Общие вопросы C/C++ 1 13.01.2010 19:08
Поиск-извлечение блока данных из бинарного файла Alter Общие вопросы Delphi 6 28.11.2009 23:12
Удаление записи из файла данных в Pascal. Paster Помощь студентам 6 09.06.2009 18:48