使用mmap、wchar\t读取文本文件

使用mmap、wchar\t读取文本文件,c,linux,gcc,wchar-t,mmapi,C,Linux,Gcc,Wchar T,Mmapi,在过去的几个小时里,我的头撞在墙上,实际上我并不真正理解这里到底出了什么问题 我有一个包含不超过128个字符的单词短语的文本文件。我试图做的是将这个文件映射到内存中,并将类型为wchar\u t的数据读入一个大的缓冲区。基本上,这个文件是一个文本查找,给定字符串的位置和长度,它将从这个文本索引中返回一个字符串 以下是我所做的(或试图完成的)示范 上面是正在运行的演示代码。我尝试过各种方法,例如使用wmemcpy或wcsncpy获取字符串。结果总是置乱字符。 如果我使用char而不是wchar\u

在过去的几个小时里,我的头撞在墙上,实际上我并不真正理解这里到底出了什么问题

我有一个包含不超过128个字符的单词短语的文本文件。我试图做的是将这个文件映射到内存中,并将类型为
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;
}