Архивировано

Эта тема находится в архиве и закрыта для публикации сообщений.

bla bla bla

Си и различные подходы к реализации

Рекомендованные сообщения

Вариант 1.

Используем fread()

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINES 1024
#define MAX_BUFFER 1024

int main(int argc, char ** argv)
{
if (argc < 3)
{
	printf("Для запуска требуется обязательные параметры,\nуказывающие путь к файлу и выбранный элемент.\n");
	return 1;
}

char * path = argv[1];
int str_get = atoi(argv[2]);

if (str_get >= MAX_LINES)
{
	printf("Запрошенных данных не существует.\nДанные доступны от 0 до %d\n",MAX_LINES);
	return 1;
}


FILE * f_desc = fopen(path,"r");
char * buff = malloc(sizeof(char)*MAX_BUFFER);
int curpos = 0;
int str_count = 0;
char ** strings = malloc(sizeof(char*)*MAX_LINES);

while (!feof(f_desc))
{
	if (str_count == MAX_LINES) break;

	fread(buff,sizeof(char),MAX_BUFFER,f_desc);
	while (curpos < MAX_BUFFER)
	{
		int pos = 0;
		char * str = malloc(sizeof(char)*MAX_BUFFER);

		while (curpos < MAX_BUFFER && buff[curpos] != '\n')
		{
			str[pos] = buff[curpos];
			curpos++;
			pos++;
		}
		curpos++;
		str[pos] = '\0';
		strings[str_count] = str;
		str_count++;

		if (str_count == MAX_LINES) break;
	}
	curpos = 0;
}
fclose(f_desc);
printf("%d == %d == %d\n%s\n",sizeof(buff),sizeof(strings[str_get]),strlen(strings[str_get]),strings[str_get]);

return 0;
}

 

Вариант 2.

Используем fgetc()

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINES 1024
#define MAX_BUFFER 1024

int main(int argc, char ** argv)
{
if (argc < 3)
{
	printf("Для запуска требуется обязательные параметры,\nуказывающие путь к файлу и выбранный элемент.\n");
	return 1;
}

char * path = argv[1];
int str_get = atoi(argv[2]);

if (str_get >= MAX_LINES)
{
	printf("Запрошенных данных не существует.\nДанные доступны от 0 до %d\n",MAX_LINES);
	return 1;
}


FILE * f_desc = fopen(path,"r");
char buff = '\0';
char *buff_str = malloc(sizeof(char)*MAX_BUFFER);
int curpos = 0;
int str_count = 0;
char ** strings = malloc(sizeof(char*)*MAX_LINES);

do 
{
	buff = (char)fgetc(f_desc);
	if (buff != '\n')
	{
		buff_str[curpos] = buff;
		curpos++;
	}else{
		buff_str[curpos] = '\0';
		strings[str_count] = str_copy(buff_str);
		curpos = 0;
		str_count++;
	}
}while (!feof(f_desc) && str_count < MAX_LINES);

fclose(f_desc);
printf("%d == %d == %d\n%s\n",sizeof(buff_str),sizeof(strings[str_get]),strlen(strings[str_get]),strings[str_get]);

return 0;
}

char * str_copy (char * str)
{
char * ret = malloc(sizeof(char)*strlen(str));
char * start = ret;
while ((*str) != '\0')
{
	(*ret) = (*str);
	ret++;
	str++;
}
return start;
}

 

А теперь вопрос, какой из предложенных вариантов кода будет работать производительнее и кто отъест меньше памяти?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

не ломайте голову, отобразите файл в память, выделите виртуальную такогоже размера (там правда не как в куче, то есть выделяя например 5000 байт, вы на самом деле выделите 2 страницы - 8Кбайт, скопируйте отображение, начальное освободите. и дальше спокойно генерируйте массив указателей, предварительно заменив все 0D 0A на 00. размер данных уже есть, плюс размер массива указателей.

 

что касается бенчмарка по скорости - то тут помогут RDTSC, GetTickCount, QueryPerformanceCounter.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах