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()修改它操作的字符串.假设您不想更改文件内容,则需要更改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()填充零的页面. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – 更改Word文档中的文本字体颜色
- 云和恩墨 Oracle Database 12.2 体系结构图海报发布
- ruby-on-rails – 导致UndefinedTable错误的命名空间模型
- ruby-on-rails – Rails,Sidekiq – Redis NOAUTH
- xml-serialization – 如何使用XStream有条件地序列化字段(
- 如何在Linq To Xml中保护Null Reference异常?
- ruby-on-rails – CanCan区别:read和[:index,:show]?
- ruby – 遍历目录和子目录中的每个.jpg或.jpeg文件
- fastjson 解析多级泛型时而失败的解决方案
- 正则式匹配不包含某一字符串的整行