使用mmap、wchar\t读取文本文件
在过去的几个小时里,我的头撞在墙上,实际上我并不真正理解这里到底出了什么问题 我有一个包含不超过128个字符的单词短语的文本文件。我试图做的是将这个文件映射到内存中,并将类型为使用mmap、wchar\t读取文本文件,c,linux,gcc,wchar-t,mmapi,C,Linux,Gcc,Wchar T,Mmapi,在过去的几个小时里,我的头撞在墙上,实际上我并不真正理解这里到底出了什么问题 我有一个包含不超过128个字符的单词短语的文本文件。我试图做的是将这个文件映射到内存中,并将类型为wchar\u t的数据读入一个大的缓冲区。基本上,这个文件是一个文本查找,给定字符串的位置和长度,它将从这个文本索引中返回一个字符串 以下是我所做的(或试图完成的)示范 上面是正在运行的演示代码。我尝试过各种方法,例如使用wmemcpy或wcsncpy获取字符串。结果总是置乱字符。 如果我使用char而不是wchar\u
wchar\u t
的数据读入一个大的缓冲区。基本上,这个文件是一个文本查找,给定字符串的位置和长度,它将从这个文本索引中返回一个字符串
以下是我所做的(或试图完成的)示范
上面是正在运行的演示代码。我尝试过各种方法,例如使用wmemcpy
或wcsncpy
获取字符串。结果总是置乱字符。
如果我使用char
而不是wchar\u t
,事情似乎是可行的,但将使用的索引是基于宽字符串的,因此如果文本文件被解释为char
,则不起作用
我需要快速访问一个大的文本文件,这就是为什么我尝试在这里使用mmap
我的(也许是愚蠢的)错误是什么
注意:valgrind也没有显示任何错误。如果您使用的是
mmap
,您需要知道文件的编码并正确处理。可能,这个文件是UTF-8格式的,所以你需要使用char*
@MicroVirus来访问它:是的,你刚刚以某种方式证实了我的想法。为了快速解决问题,我现在阅读了mmap witg类型char*
,然后用mbstowcs
对其进行转换。这对现在很有帮助,似乎我必须将查找部分更改为更好的解决方案。如果使用mmap
,则应该使用,您需要了解文件的编码并正确处理。可能,这个文件是UTF-8格式的,所以你需要使用char*
@MicroVirus来访问它:是的,你刚刚以某种方式证实了我的想法。为了快速解决问题,我现在阅读了mmap witg类型char*
,然后用mbstowcs
对其进行转换。这有助于现在,似乎我必须改变查找部分,以更好的解决方案。
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;
}