gpt4 book ai didi

c - 使用 strtok 解析 mmaped 文件?

转载 作者:太空狗 更新时间:2023-10-29 15:15:55 28 4
gpt4 key购买 nike

这是我的问题:我想映射文件“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");
}

输出是段错误。那为什么我不能使用 StrTok?

最佳答案

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

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

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

使用 PROT_READ|PROT_WRITEMAP_PRIVATE 映射文件:

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

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

注意事项:

如果文件大小与用于映射的页面大小的倍数完全匹配,则该文件将不是以 NUL 结尾的字符串,并且当 strtok() 尝试读取映射的末尾。

在这种情况下,您可以mmap() 紧跟在文件映射之后的零填充页面。

关于c - 使用 strtok 解析 mmaped 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33904180/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com