在过去的几个小时里,我把头撞在墙上,实际上并不真正理解这里出了什么问题。
我有一个包含不超过 128 个字符的词组的文本文件。我尝试做的是内存映射这个文件并将类型读取wchar_t
到一个大缓冲区中。基本上这个文件是一个文本查找,给定字符串的位置和长度将从这个文本索引中返回一个字符串。
这是 - 至于演示 - 我做了什么(或试图完成)。
int main(int argc, char **argv)
{
int fd = 0;
struct stat statbuf;
wchar_t aux[128] = {0};
const wchar_t *px = NULL;
setlocale(LC_CTYPE, "");
setlocale(LC_COLLATE, "");
fd = open("./test2_termlist.txt", O_RDONLY);
fstat(fd, &statbuf);
void *p = mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
/* Could have casted p to wchar_t already ... */
px = (wchar_t *)p;
/* Copy string with 45 characters from char position 92 */
memcpy(aux, (const wchar_t *)px + 92, 45);
aux[45] = L'\0';
printf("string = %ls\n", aux);
return 1;
}
以上是工作演示代码。我尝试了各种方法,例如使用wmemcpy
或wcsncpy
获取字符串。结果总是乱码。如果我使用char
而不是wchar_t
,事情似乎可以工作,但是将使用的索引基于宽字符串,因此如果文本文件被解释为char
.
我需要快速访问大型文本文件,这就是我尝试在mmap
这里使用的原因。
我在这里(也许是愚蠢的)错误是什么?
注意:valgrind 也不显示任何错误。