Я делаю синтаксический анализатор для чтения .X файлов для рендерера, и я столкнулся с проблемой при анализе файла.
Ошибка, по-видимому, показывает, что в функции синтаксического анализа обнаружено повреждение кучи. Эта проблема возникает только в определенной строке файла.
Следующий код — моя функция чтения, и я отследил ошибку getline(meshData, lineBuffer);
,
void CAppX::loadFile(){
string lineBuffer;
int lineNumber = 0;
bool fileSelected = false;
std::wstring fileDirectory = L"";
fileDirectory.resize(MAX_PATH);
OPENFILENAME file;
ZeroMemory(&file, sizeof(file));
file.lStructSize = sizeof(file);
file.hwndOwner = NULL;
file.lpstrFilter = L" X Files\0*.x\0";
file.lpstrFile = &fileDirectory[0];
file.nMaxFile = MAX_PATH;
file.lpstrTitle = L"Choose a model to load";
file.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
while (fileSelected == false)
{
if (0 != GetOpenFileName(&file))
{
fstream meshData;
meshData.open(fileDirectory);
wcout << "Summarizing " << fileDirectory << endl;
while (!meshData.eof())
{
getline(meshData, lineBuffer);
lineNumber++;
if (lineNumber == 55)
{
cout << endl;
}
cout << "Line " << lineNumber << " (" << lineBuffer.size() << " chars)" << ": " << lineBuffer << endl;
if (lineBuffer.size() > 0)
{
parseBuffer(lineBuffer);
}
}
meshData.close();
fileSelected = true;
}
else
{
MessageBox(NULL, L"A compatible model must be selected", L"No model chosen", MB_ICONWARNING);
}
}}
Далее вот парсер. И главным образом, я хотел получить все токены в while
а не со второго токена и далее.
void CAppX::parseBuffer(string & line){
int currentData = NULL; //Helps to open gateways and classify data
string originalLine; //Stores the original line
char separators[] = " .,;{}[]-<>"; //Symbols that mustn't be read from file
char* lastToken = NULL;
char* token = "null"; //Stores each parsed value or data from the line
char* unparsedData = NULL; //Stores the rest of the line as data becomes tokenized
//Storing the original line. Else, the line will be interrupted by null characters, preventing full copy
originalLine = line;
// This two lines prevents the first token from being parsed out of the <while> cycle
strtok_s((char*)line.c_str(), separators, &unparsedData); //Establishing "unparsedData" as context
strcpy(unparsedData, (char*)originalLine.c_str()); //Copying the original line as "unparsedData"
while (token != NULL)
{
token = strtok_s(NULL, separators, &unparsedData);
lastToken = token;
}}
Беда начинается с этой строки в консоли
Line 26 (26 chars): DWORD nFaceVertexIndices;
Когда программа заканчивает анализ этой строки, следующая сообщает об ошибке повреждения кучи в getline()
пытаясь прочитать
Line 27 (51 chars): array DWORD faceVertexIndices[nFaceVertexIndices];
как было сказано ранее.
Когда я игнорирую это предупреждение, остальная часть файла анализируется нормально, и с этого момента никаких других проблем не возникает.
Искренне не знаю, из-за чего проблема может быть слишком большой, чтобы ее нельзя было передать токенам. Я заметил, что прежде чем я изменил свой синтаксический анализатор для его токенизации с самого начала в while
, он работал просто отлично, и никаких кучи коррупции не произошло.
Вот ссылка на файл .X, который вы можете проверить, если хотите.
Задача ещё не решена.
Других решений пока нет …