C++ 读取文件(内存映射),然后将字符串拆分为令牌
Visual Studio不断报告的代码有问题: Z Final Project.exe中0x628D692E(msvcr120.dll)处未处理的异常:0xC0000005:访问冲突写入位置0x00990004 从文件中读取字符串后,我尝试将其拆分为标记: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
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特有的;上述方法有效。