参考资料
mmap 函数:原理与使用(含代码)
mmap函数使用与实例详解
Linux系统编程:mmap使用技巧
mmap和普通文件读写的区别和比较 & mmap的注意点
认真分析mmap:是什么 为什么 怎么用
github源码
一、mmap读入文件
#include<iostream>
#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
using namespace std;
void CreateFromFile(string& FileName)
{
int fd = open(FileName.c_str(), O_RDONLY);
int len = lseek(fd, 0, SEEK_END);
char* data = (char*)mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
close(fd);
auto p_end = data;
vector_3 value;
while (*p_end != '\0')
{
for (short int i = 0; i < 3; ++i)
{
value.value[i] = strtoul(p_end, &p_end, 10);
++p_end;
if (i < 2)
{
node_set.push_back(value.value[i]);
}
}
tmp_arcs.push_back(value);
}
munmap(data, len);
do somthing;
二、mmap写入文件
#include<iostream>
#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
using namespace std;
void PrintResult(string& outFileName)
{
do something;
string total_size_s = to_string(total_size) + "\n";
int len = total_size_s.size() + 1;
for (int i = 0; i < THREAD_NUM; ++i)
{
len += answer_len[i];
}
int fd = open(outFileName.c_str(), O_RDWR | O_CREAT, 0666);
lseek(fd, len - 1, 0);
write(fd, "h", 1);
char* addr = (char*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
auto iter = addr;
memcpy(addr, total_size_s.c_str(), total_size_s.size());
addr += total_size_s.size();
uint t[THREAD_NUM];
uint process_id = 0;
for (uint i = 0; i < 5; ++i)
{
for (uint j = 0; j < THREAD_NUM; ++j)
t[j] = 0;
process_id = 0;
while (size[i])
{
for (uint j = 0; j < THREAD_NUM; ++j)
{
while (t[j] < result_stat[j][i].size() && result_stat[j][i][t[j]] == process_id)
{
memcpy(addr, result[j][i][t[j]].c, strlen(result[j][i][t[j]].c));
addr += strlen(result[j][i][t[j]].c);
++t[j];
--size[i];
}
++process_id;
}
}
}
memcpy(addr, "\n", 1);
munmap(iter, len);
}
三、int型 转 字符串
void my_itoa(char* buf, unsigned int val)
{
unsigned int vals[10] = {};
int len = 0;
do
{
vals[len] = val % 10;
val /= 10;
++len;
} while (val > 0);
--len;
char* p = buf;
do
{
*p = vals[len] + '0';
++p;
--len;
} while (len >= 0);
*p = ',';
++p;
*p = '\0';
}
四、unsigned int型 转 字符串(通过查询的方式)
inline void ui2S(MyContainer& a, vector<m_answer>& b, vector<uint>& c, const uint& thread_index)
{
c.push_back(a.base[0]);
m_answer s_temp;
char* p1 = s_temp.c;
char* p2 = NULL;
for (unsigned int i = 0; i < a.rear; ++i)
{
p2 = vexs[a.base[i]].id_char;
while (*p2 != '\0')
{
*p1 = *p2;
++p1;
++p2;
}
}
*p1 = '\0';
--p1;
*p1 = '\n';
answer_len[thread_index] += strlen(s_temp.c);
b.push_back(s_temp);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)