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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2010, 00:09   #1
newkobra
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 33
По умолчанию Запись в середину файла

Продолжения этой темы: http://programmersforum.ru/showthread.php?t=88120
Никак не получаеться реализовать запись в середину и конец файла. Каждый раз когда я открываю файл для записи в нем стираеться все содержимое.
Можна ли как нибудь с помощью класса fstream реализовать запись в середину и конец файла? Мне нужно чтоб в середину файла писало с заменой того что сейчас там есть, к примеру если в файле строка "ЙЦУКЕНГШЩЗ", и у меня указатель на букве К, и я туда пишу А, должно получиться "ЙЦУАЕНГШЩЗ".
newkobra вне форума Ответить с цитированием
Старый 21.03.2010, 00:58   #2
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

нету такого системного вызова и формат данных не предусматривает запись в середину. Самому надо реализовывать это
подпись
liljon вне форума Ответить с цитированием
Старый 21.03.2010, 01:10   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Один из способов
Код:
#include <stdio.h>
int main ()
{
  FILE * pFile;
  pFile = fopen ("1.txt","r+");//открываем для правки
  if (pFile!=NULL)//проверяем что удалось открыть
  {
    fseek(pFile, 2, SEEK_SET);//в файле pFile перемещаемся на 2 позиции вперёд относительно начала файла
    fwrite("A", 1, 1, pFile);//пишем туда символ А
    fclose (pFile);
  }
  return 0;
}
eoln вне форума Ответить с цитированием
Старый 21.03.2010, 01:12   #4
Programm_kz
Новичок
Джуниор
 
Регистрация: 21.03.2010
Сообщений: 2
По умолчанию

пацаны помогите у меня отказал дисковод хочу комп переустановить вообще невозможно глючит плиззз
Programm_kz вне форума Ответить с цитированием
Старый 21.03.2010, 01:18   #5
newkobra
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 33
По умолчанию

а как можна записывать структуру в бинарном виде? и как узнавать размер файла в таком случае?
newkobra вне форума Ответить с цитированием
Старый 21.03.2010, 01:27   #6
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Один из способов
Код:
#include <stdio.h>
int main ()
{
  FILE * pFile;
  pFile = fopen ("1.txt","r+");//открываем для правки
  if (pFile!=NULL)//проверяем что удалось открыть
  {
    fseek(pFile, 2, SEEK_SET);//в файле pFile перемещаемся на 2 позиции вперёд относительно начала файла
    fwrite("A", 1, 1, pFile);//пишем туда символ А
    fclose (pFile);
  }
  return 0;
}
Это перезапишет байт со двигом в 3 байта вправо.

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

Или же посчитать размер записываемой структуры, переместиться в середину, считать байты во временный буфер размером записываемой структуры, записать то, что нужно вставить. Далее копировать во второй временный буффер часть файла, следующую за первым буффером, записать первый буфер, скопировать третью часть , записать второй буфер. и так до конца файла =)

Для работы с файлами пользуюсь функциями из stdio, могу сбросить сюда функцию для вашей цели.
А вообще планируйте формат файла, таким образом, чтобы все новые данные лежали в конце файла. Тем более если вы пишете БД, представте что будет если файл размером в 50 мб будет перезаписывать на каждый запрос.

Цитата:
Сообщение от liljon Посмотреть сообщение
нету такого системного вызова и формат данных не предусматривает запись в середину. Самому надо реализовывать это
подпись

Последний раз редактировалось liljon; 21.03.2010 в 01:36.
liljon вне форума Ответить с цитированием
Старый 21.03.2010, 01:50   #7
newkobra
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 33
По умолчанию

Цитата:
Сообщение от liljon Посмотреть сообщение
Для работы с файлами пользуюсь функциями из stdio, могу сбросить сюда функцию для вашей цели.
А вообще планируйте формат файла, таким образом, чтобы все новые данные лежали в конце файла. Тем более если вы пишете БД, представте что будет если файл размером в 50 мб будет перезаписывать на каждый запрос.
У меня задания такое... Нужно организировать прямой доступ к файлу. Какая есть возможность чтоб читать из любого места из файла бинарную структуру и также ее записывать?
newkobra вне форума Ответить с цитированием
Старый 21.03.2010, 02:57   #8
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Код:
/*
f - указатель на файл
Data - указатель на блок данных
size - размер блока данных
from - место с которого записывать

int bsize = 60000; - максимальный размер временного буфера 
*/
int fmwrite(FILE * f, void * Data, int size, int from)
{
	int bsize = 60000;

	fseek(f,0L,SEEK_END);
	int s = ftell(f);
	fseek(f,s+size,0);
	fseek(f,from,0);

	int nsize = s + size;
	int alloc = bsize > s ? s-from : bsize;
	char * temp = (char*)malloc(alloc);
	
	int pose = nsize;
	while (pose > from)
	{
		int read = pose-size <= from ? size : alloc; 
		fseek(f,pose - size - read,0);
		fread((void*)temp,read,1,f);

		fseek(f,pose - read,0);
		fwrite((void*)temp,read,1,f);
		
		pose -= read;
	}
	fseek(f,from,0);
        free(temp);
	return fwrite(Data,size,1,f);
}

/*
 В файле лежит текст 12A34567890
 После выполнения функции fmwrite 
 в файле будет  12BBA34567890
*/
char * txt = "BB;
FILE * f = fopen("1.txt","rb+");
fmwrite(f,(void*)txt,strlen(txt),2);
fclose(f);
Вроде все работает
подпись

Последний раз редактировалось liljon; 21.03.2010 в 02:59.
liljon вне форума Ответить с цитированием
Старый 21.03.2010, 13:40   #9
newkobra
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 33
По умолчанию

Цитата:
Сообщение от liljon Посмотреть сообщение
Код:
/*
f - указатель на файл
Data - указатель на блок данных
size - размер блока данных
from - место с которого записывать

int bsize = 60000; - максимальный размер временного буфера 
*/
int fmwrite(FILE * f, void * Data, int size, int from)
{
	int bsize = 60000;

	fseek(f,0L,SEEK_END);
	int s = ftell(f);
	fseek(f,s+size,0);
	fseek(f,from,0);

	int nsize = s + size;
	int alloc = bsize > s ? s-from : bsize;
	char * temp = (char*)malloc(alloc);
	
	int pose = nsize;
	while (pose > from)
	{
		int read = pose-size <= from ? size : alloc; 
		fseek(f,pose - size - read,0);
		fread((void*)temp,read,1,f);

		fseek(f,pose - read,0);
		fwrite((void*)temp,read,1,f);
		
		pose -= read;
	}
	fseek(f,from,0);
        free(temp);
	return fwrite(Data,size,1,f);
}

/*
 В файле лежит текст 12A34567890
 После выполнения функции fmwrite 
 в файле будет  12BBA34567890
*/
char * txt = "BB;
FILE * f = fopen("1.txt","rb+");
fmwrite(f,(void*)txt,strlen(txt),2);
fclose(f);
Вроде все работает
много кода... почему не подходит метод который написал eoln? кажеться он делает все что мне нужно. Мне не нужно добавлять в середину файла, а заменять содержимое в файле.
newkobra вне форума Ответить с цитированием
Старый 21.03.2010, 13:51   #10
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

та ну вас в баню всех :\
подпись
liljon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запись файла dedyshka PHP 5 07.12.2009 17:15
Восстановление окна на середину экрана. Airou Общие вопросы Delphi 5 27.10.2009 15:40
Запись из файла в переменную Sekt Общие вопросы C/C++ 1 20.10.2009 13:02
Запись/чтение из файла (С++) alexov Общие вопросы C/C++ 15 18.01.2009 17:35