Im пытается работать с чтением mmap из файла в цикле, У меня есть файл содержит информацию о 3 частях, первая часть размером 3 * sizeof (double), вторая также в размере 3 * sizeof (double), а третий с размером sizeof (double). В первой части файла у меня HEADER размером 32768 байт. Файл организован:mmap из файла в цикле
ГОЛОВКА Часть (1), часть (1) .... Часть (1) || Часть (2), часть (2) .... Часть (2) || Часть (3), часть (3) .... Часть (3) |
Каждая часть у меня есть 100 раз. Я хочу работать каждый раз с 30 частями (10 частей от каждой части).
Я попробовал этот код:
void readingFile(FILE *file, double *a, double *b, double *c, int start, int end, int chunksz, long total)
{
int i = 0;
int size = end - start + 1;
int fd;
fd = fileno(file);
off_t fullsize = lseek(fd,SEEK_CUR,SEEK_END); //getting the file size
fullsize-=1;//the lseek gives one more byte, its ok!
unsigned long summ = (unsigned long)(start-1)*chunksz; //chunk is 56
summ+=(unsigned long)HEADER_SIZE;//offset the header size
unsigned long paramm=(unsigned long)((unsigned long)summ/(unsigned long)(sysconf(_SC_PAGE_SIZE)));
unsigned long param = floor(paramm);
void *buf=NULL;
buf =mmap(NULL,fullsize , PROT_READ, MAP_PRIVATE , fd, param*sysconf(_SC_PAGE_SIZE));
if(buf==MAP_FAILED)
{
printf("we have an error\n");
}
unsigned long gapp = (sysconf(_SC_PAGE_SIZE))*param;
unsigned long gap =summ-gapp;
buf+=gap;
memcpy(a,buf,3*sizeof(double)*size);
buf+=(unsigned long)((long)total-(start-1))*3*sizeof(double);
buf+=((start-1)*3*sizeof(double));
memcpy(b,buf,3*sizeof(double)*size);
buf+=(unsigned long)((long)total-(start-1))*3*sizeof(double);
buf+=((start-1)*sizeof(double));
memcpy(c,buf,sizeof(double)*size);
munmap(buf, fullsize);
return;
}
Где-то в пути у меня есть Переполнение и программа разваливается! Каждый раз, когда вызываемая функция, новая память распределяется должным образом на a, b, c. Что здесь? Процесс разбился на итерации № 14 в строке:
memcpy(c,buf,sizeof(double)*size);
Спасибо!
«Где-то в пути, у меня переполнение». Используйте отладчик, чтобы точно узнать «где-то». – kaylum
Если вы получаете файловый дескриптор, вы можете использовать 'fstat()'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/fstat.html), чтобы получить размер файла вместо 'lseek() '. Использование 'lseek()' в файле, уже открывшемся с помощью 'FILE * ', может привести к поломке вещей, если данные' FILE * 'ожидают, что смещение файла будет там, где оно осталось. Вы также сопоставляете количество байтов, равное полному размеру файла - **, но с ненулевым смещением **. И если ваш вызов 'mmap()' терпит неудачу, вам нужно сделать что-то другое, кроме как распечатать ошибку, а затем продолжить работать, как ничего не произошло. –
Файл открыт, и ошибка не является дуэтом для вызова mmap. – raptor0102