mmap内存映射写入txt文件
内存映射写入应该是一个比较简单的操作,网上也有线程的例子,不过我自己在使用时碰到了一点小问题,所以总结了下,有相似情况的小伙伴们可以参考下哈。另外贴一篇别人的博客,写得很详细,刚接触的可以看下链接: 传送门.
基本的做法,网上有例子,如下
#include <sys/mman.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include<unistd.h>using namespace std;int main() {char data[] = “test_data”;int len = strlen(data);int fd = open(“test.txt”, O_RDWR | O_CREAT, 00777);// 不存在则创建lseek(fd, len – 1, SEEK_END);// 定义空文件长度write(fd, “”, 1);// 文件最后写入一个空字符char *buffer = (char *) mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);close(fd);memcpy(buffer, data, len);munmap(buffer, len);}
我碰到的问题是当使用了头文件<unistd.h>后,原来的代码莫名出现了一堆错误,而去掉这个头文件则完全没问题。而lseek()和close()两个函数都需要这个头文件,所以想到用fseek,应该也可以。
open()打开文件的返回值是一个整形,代表着进程号,而fopen则是一个File指针,这两个可以相互转化。
int main() {char data[] = “test_data”;int len = strlen(data);FILE *fp = fopen(“test.txt”, “wb”); int fd = fileno(fp);fseek(fp, len – 1, SEEK_END);fwrite(“”, sizeof(char), 1, fp);char *buffer = (char *)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);fclose(fp);memcpy(buffer, data, len);munmap(buffer, len);}
用fopen打开,然后转为fd进行内存映射,不过报了Segmentation fault (core dumped)的错误,所以再换一下思路。
int main() {char data[] = “phzphz\nphzphz”;int len = strlen(data);int fd = open(“test.txt”, O_RDWR | O_CREAT, 00777); FILE *fp = fdopen(fd, “wb”);fseek(fp, len – 1, SEEK_END);fwrite(“”, sizeof(char), 1, fp);char *buffer = (char *)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);fclose(fp);memcpy(buffer, data, len);munmap(buffer, len);}
然后接可以了,虽然麻烦了点,但是至少可以用了,写入几百M的数据比fwrite快一些。
63322702