C++ 读取文件(内存映射),然后将字符串拆分为令牌

C++ 读取文件(内存映射),然后将字符串拆分为令牌,c++,string,token,C++,String,Token,Visual Studio不断报告的代码有问题: Z Final Project.exe中0x628D692E(msvcr120.dll)处未处理的异常:0xC0000005:访问冲突写入位置0x00990004 从文件中读取字符串后,我尝试将其拆分为标记: int main() { HANDLE hFile , MapHandle; char * name = new char[20]; char * word = new char[100]; char * d

Visual Studio不断报告的代码有问题:

Z Final Project.exe中0x628D692E(msvcr120.dll)处未处理的异常:0xC0000005:访问冲突写入位置0x00990004

从文件中读取字符串后,我尝试将其拆分为标记:

int main()
{
    HANDLE hFile , MapHandle;
    char * name = new char[20];
    char * word = new char[100];
    char * data , * MapPointer;
    strcpy_s(name , 10 , "d0000.txt");
    //List DocumentList;
    Trie document;
    clock_t start = clock();
    do
    {
        next_document(name , 4);
        hFile = CreateFileA(name , GENERIC_READ | GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , FILE_FLAG_RANDOM_ACCESS , NULL);
        MapHandle = CreateFileMapping(hFile , NULL , PAGE_READWRITE | SEC_RESERVE , 0 , 0 , 0);
        if (MapHandle == NULL)
        {
            CloseHandle(hFile);
            break;
        }
        cout << name << ": ";
        MapPointer = (char *) (MapViewOfFile(MapHandle , FILE_MAP_READ , 0 , 0 , 0));
        start = clock();
        SplitText(MapPointer , document);
        cout << clock() - start << endl;
        UnmapViewOfFile(MapPointer);
        CloseHandle(MapHandle);
        CloseHandle(hFile); 
    } while (true);
    std::cout << clock() - start << std::endl;
    delete[] name;
    delete[] word;
    return 0;
}

void SplitText(char * text ,
               Trie & document)
{
    static char * delimiters = " ,.?\xc4\x88\x97\x93\x94\x60\xa8\xe1\xb4\"\t:;!()!@#$%^&*";
    char * token = nullptr , * next = nullptr;
    token = strtok_s(text , delimiters , &next);
    while (token != nullptr)
    {
        document.insert(token);
        token = strtok_s(nullptr , delimiters , &next);
    }
}
intmain()
{
句柄文件,映射句柄;
字符*名称=新字符[20];
字符*字=新字符[100];
字符*数据,*映射指针;
strcpy_s(名称,10,“d0000.txt”);
//清单文件清单;
Trie文件;
时钟启动=时钟();
做
{
下一份文件(名称,4);
hFile=CreateFileA(名称、通用读取、通用写入、0、NULL、打开现有、文件标志、随机访问、NULL);
MapHandle=CreateFileMapping(hFile,NULL,PAGE_READWRITE | SEC_RESERVE,0,0,0);
if(MapHandle==NULL)
{
闭合手柄(hFile);
打破
}

无法删除
SplitText
调用。请运行上述代码。您是否仍然存在访问冲突?如果是,请将
memset
分配的变量设置为0。再次运行代码。如果没有访问冲突,请调用
SplitText
。如果访问冲突,则是您的
SplitText
@Brandon中的某个内容,似乎SplitText有问题strtok_.Try:将
向量
更改为
Trie
。它将如图所示工作。在调用
SplitText
之前,您应该先检查
MapPointer
是否为
NULL
。我不确定
strtok_
。这是Microsoft Windows特有的;上述方法有效。