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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2009, 00:08   #1
Vinny
 
Регистрация: 06.11.2007
Сообщений: 7
По умолчанию С++. Кеширование чтения\записи файла

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

Вот этот ужасъ:
Алгоритм 1. Чтение данных с использование кеша.
1. Получить данные из запроса
2. Преобразовать данные запроса ввода-вывода к форме хеш данных.
3. Произвести поиск в кеше линейки с совпадающими хеш данными.
4. Если все данные найдены, то произвести их возврат пользователю.
5. В противном случае, произвести чтение из файла недостающих данных.
6. Все прочитанные данные разместить в линейках кеша, дополняя неполные линейки,
заполняя пустые линейки, заменяя полные линейки по алгоритму FIFO.
7. Из полученных и хранимых данных сформировать ответ и вернуть его пользователю.
Алгоритм 2. Запись данных с использованием кеша.
1. Произвести запись данных в файл (сквозная запись).
2. Получить данные из запроса
3. Преобразовать данные запроса ввода-вывода к форме хеш данных.
4. Произвести поиск в кеше линейки с совпадающими хеш данными.
5. Если найдены все необходимые линейки, то произвести запись в них обновленных
данных.
6. В противном случае, разместить данные в линейках кеша, дополняя неполные
линейки, заполняя пустые линейки, заменяя полные линейки по алгоритму FIFO.

Выполните отладку разработанных программ. Для этого напишите
последовательность тестовых запросов на ввод и вывод, выполните их и проверьте
при помощи служебной функции состояние кеш-памяти (выведя ее на экран или в
файл). Вы можете все свои действия над файлом и кеш-памятью сопровождать
выводом в лог файл. Для уменьшения сложности тестирования установите размер
кеша в 10 линеек.
Vinny вне форума Ответить с цитированием
Старый 03.06.2009, 00:43   #2
Vinny
 
Регистрация: 06.11.2007
Сообщений: 7
По умолчанию

Код:
#include "stdafx.h"
# include <stdlib.h>
# include <stdio.h>
# include <string.h>
#define true 1
#define false 0
struct line {
	char data[128];
	int start;
	int len;
	FILE *stream;

};
struct cache {
	struct line *l;
	int lines;
	int cur;
};

struct cache c;
int rfromc = 0;

int cfread (char *buf, int size, int count, FILE *sm){
	int r; //прочитать инфы
	int pos;//текущее положение каретки
	int i;
	r = count * size;
	pos = ftell (sm);
	for (i = 0; i<c.lines; i++){
		if ( (c.l[i].stream == sm) && (c.l[i].start == pos) && (c.l[i].len == r) ){
			memcpy (buf, c.l[i].data, r);
			rfromc = 1;
			fseek (sm, r, SEEK_CUR);
			return r;
		}
	}
	//вычисление стартового байта новой линейки
	
	r = fread (buf, size, count, sm);//изменения
	

	memcpy (c.l[c.cur].data, buf, r);
	c.l[c.cur].stream = sm;
	c.l[c.cur].start = pos;
	c.l[c.cur].len = r;
	rfromc = 0;//собстнно фифо
	if (c.cur == c.lines)
		c.cur = 0;
	else c.cur++;
	return r;
	
}

int cfwrite (char *buf, int size, int count, FILE *stream){
	int r; //прочитать инфы
	int pos;//текущее положение каретки
	int i;
	int x;// номер линейки для записи новой инфы
	r = count * size;
	pos = ftell (stream);
	for (i = 0; i<c.lines; i++){
		if ( (c.l[i].stream == stream) && (c.l[i].start == pos) && (c.l[i].len == r) ){
			memcpy (c.l[i].data, buf, r);
			break;
		}
	}
	r = fwrite (buf, size, count, stream);
	x = rand () % c.lines;
	memcpy (c.l[x]. data, buf, r);
	c.l[x].stream = stream;
	c.l[x].start = pos;
	c.l[x].len = r;

	return r;
	
}

int create (int num){
	if ((c.l = (struct line*) malloc (num * sizeof (struct line))) == NULL){
		return 1;
	}
	c.lines = num;
	c.cur = 0;
	return 0;
}
int clear(struct line l){
	int i;
	for (i = 0; i<128; i++)
		l.data[i] = '0';
	l.start = 0;
	l.len = 0;
	l.stream = NULL;
	return 0;
}
void clean (char *buf){
	int i;
	for (i = 0; i<strlen (buf); i++)
		buf[i] = ' ';
}
void showcache (){
	int i;
	for (i = 0; i<c.lines; i++){
		printf ("c.l[%i]\ndata : %-128s\tstart: %4i\tlen : %4i\n", i, c.l[i].data, c.l[i].start, c.l[i].len);//	int start;int len;
	}
}
int main (void){
	short isCreated = false;
	if (create (10)){
		printf ("Memory allocation error");
		exit (1);
	}
	isCreated = true;
	short isOpened = false;
	char *fname;
	char *command;
	char str[256];
	FILE *stream;
	int bytes = 0;
	
	if ( (fname = (char*)malloc(20)) == NULL ){
		printf ("Memory allocation error");
		exit (1);
	}
	if ( (command = (char*)malloc (20)) == NULL){
		printf ("Memory allocation error");
		exit (1);
	}
	do {
		printf (">");
		scanf ("%s", command);
		{
			if (!strcmp (command, "open")){
				scanf("%s", fname);
				if ((stream = fopen (fname, "r+")) == NULL)
					printf ("Error while opening file\n");
				else
					isOpened = true;
			}
			if (!strcmp (command, "close")){
				if (isOpened){
					fclose (stream);
					isOpened = false;
				}
				else printf ("Nothing to close!\n");
			
			}
			if (!strcmp (command, "read")){
				if (isOpened){
					scanf ("%i", &bytes);
					clean (str);
					printf ("%i\n", cfread (str, 1, bytes, stream));
					if (rfromc)
						printf("From cache!\n");
					printf ("%s\n", str);
					
				}
				else printf ("File not open!\n");
			}
			if (!strcmp (command, "write")){
				if (isOpened){
					clean (str);
					scanf ("%s", str);
					printf ("%i\n", cfwrite (str, 1, strlen (str), stream));
					printf ("%s\n", str);
				}
				else printf ("File not open!\n");
			}
			if (!strcmp(command, "show")){
				if (isCreated){
					showcache();
				}else printf ("Cache does not exist!");
			}
		
		}
	} while(strcmp (command, "exit"));
	free(fname);
	free(command);
	free (c.l);
	if (isOpened){
		fclose (stream);
	}
	return 0;
}
Ругаеться на "нарушение прав доступа при чтении" при попытке произвести чтение или запись из файла\в файл.
Подскажите как исправить пожалуйста
Vinny вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка чтения файла Umnik1 Общие вопросы Delphi 12 25.06.2013 22:57
Защита HDD от чтения/записи при любых условиях. Air Свободное общение 43 17.05.2009 18:33
Как узнать программно скорость чтения и записи на жесткий диск. начинающий кодер Общие вопросы Delphi 7 05.03.2009 16:13
Програма чтения из файла на дельфи terminadoor Помощь студентам 18 03.07.2008 18:14