int readlen = 5*1024*1024;
//int readlen = 1024;
int fd = open("/home/bonc/BC000D0300420131210000001.AVL",O_RDONLY);
//int fd = open("/home/bonc/ds.ini",O_RDONLY);
int len = lseek(fd,0,SEEK_END);
//if(!file)
// printf("can not open file!\n");
std::string s;
int start = time(NULL);
int offset = 0;
//while(getline(file, s))
while(len > 0)
{
if(len <= readlen)
readlen = len;
char *mbuf = (char *)mmap(NULL, readlen, PROT_READ, MAP_PRIVATE, fd, offset);
if(MAP_FAILED == mbuf)
{
perror("mbuf can not get address!\n");
break;
}
int pos = 0;
int start = 0;
while(pos < readlen)
{
if(*(mbuf + pos) != '\n')
{
s.append((const char*)(mbuf + pos), 1);
pos++;
}
else
{
//s.assign(mbuf + start, pos - start);
//cout << s << endl;
s = "";
pos++;
//start = pos;
}
}
offset += readlen;
len -= readlen;
munmap( mbuf, readlen );//解除映射关系
//msync ( mbuf , readlen, MS_SYNC);//更新文件
//cout << s << endl;
}
int end = time(NULL);
printf("it takes %d seconds\n", end-start);
return 0;
上述代码 主要用途 分段映射大文件(代码比较糙,主要问了记录下述错误);
注意问题 :mmap 最后一个参数 必须为页大小的倍数 ,否则报错:Invalid Argument;