加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 用strtok解析mmaped文件?

发布时间:2020-12-16 10:12:13 所属栏目:百科 来源:网络整理
导读:这是我的问题:我想映射文件“filename.txt”,它基本上由每行两对字符串组成: "string1 string2 string3 string4 string5 string6..." 然后我想用strtok分隔不同的字符串. 所以我像这样映射文件: // open fileif ((fdsrc = open("filename.txt",O_RDONLY))
这是我的问题:我想映射文件“filename.txt”,它基本上由每行两对字符串组成:

"string1 string2
 string3 string4
 string5 string6..."

然后我想用strtok分隔不同的字符串.

所以我像这样映射文件:

// open file
if ((fdsrc = open("filename.txt",O_RDONLY)) < 0) {
        fprintf(stderr,"src open error");
        exit(1);
    }

// get the size of the file
if (fstat(fdsrc,&statbuf) < 0) {
    fprintf(stderr,"fstat error");
    exit(1);
}

// mmap the file
if ((src = mmap(0,statbuf.st_size,PROT_READ,MAP_SHARED,fdsrc,0)) == (caddr_t) -1) {
    fprintf(stderr,"mmap src");
    exit(1);
}

当我跑线

printf("src: %s n",src);

它正确打印文件的内容!

但是当我试图分开这些词时

char* token;
token = strtok(src," n");
while (token != NULL) {
    token = strtok(NULL," n");
}

输出是Segmentation Fault.
为什么我不能使用StrTok呢?

解决方法

strtok()修改它操作的字符串.假设您不想更改文件内容,则需要更改mmap()选项.

您正在以只读方式打开和映射文件:

if ((fdsrc = open("filename.txt",O_RDONLY)) < 0) {
...
if ((src = mmap(0,0)) == (caddr_t) -1) {
...

使用PROT_READ | PROT_WRITE和MAP_PRIVATE映射文件:

src = mmap(0,PROT_READ|PROT_WRITE,MAP_PRIVATE,0);
if (src == (caddr_t) -1) {

您可能需要使用O_RDWR而不是O_RDONLY打开该文件

请注意:

如果文件大小与用于映射的页面大小的多个完全匹配,则该文件将不是NUL终止的字符串,当strtok()尝试读取映射结束时,您可能会获得SIGSEGV.

在这种情况下,您可以在文件映射后立即mmap()填充零的页面.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读