Доступ к нарушению при использовании _tcstok - PullRequest
0 голосов
/ 12 июля 2011

Я пытаюсь токенизировать строки в файле, используя _tcstok. Я могу токенизировать линию один раз, но когда я пытаюсь токенизировать ее второй раз, я получаю нарушение прав доступа. Я чувствую, что это как-то связано не с фактическим доступом к значениям, а с местоположениями. Я не уверен, как еще это сделать.

Спасибо

Dave

p.s. Я использую TCHAR и _tcstok, потому что файл UTF-8.

Это ошибка, которую я получаю:

Исключение первого шанса в 0x63e866b4 (msvcr90d.dll) в Testing.exe: 0xC0000005: расположение чтения нарушения доступа 0x0000006c.

vector<TCHAR> TabDelimitedSource::getNext() {
// Returns the next document (a given cell) from the file(s)
TCHAR row[256]; // Return NULL if no more documents/rows
vector<TCHAR> document;

try{
    //Read each line in the file, corresponding to and individual document
    buff_reader->getline(row,10000);
    }
catch (ifstream::failure e){
        ; // Ignore and fall through
    }

if (_tcslen(row)>0){
    this->current_row += 1;
    vector<TCHAR> cells;
      //Separate the line on tabs (id 'tab' document title 'tab' document body)
     TCHAR *  pch;
     pch = _tcstok(row,"\t");
     while (pch != NULL){
         cells.push_back(*pch);
         pch = _tcstok(NULL, "\t");
     }

    // Split the cell into individual words using the lucene analyzer
    try{
      //Separate the body by spaces
        TCHAR original_document ;
        original_document = (cells[column_holding_doc]);
        try{
            TCHAR * pc;
            pc = _tcstok((char*)original_document," ");
             while (pch != NULL){
                 document.push_back(*pc);
                pc = _tcstok(NULL, "\t");
             }

1 Ответ

1 голос
/ 12 июля 2011

Прежде всего, ваш код представляет собой беспорядочную смесь манипуляций со строками C и C ++.Это просто закопает вас в яму.В идеале вы должны разбить строку на std::vector<std::wstring>

Кроме того, вы очень запутались в TCHAR и UTF-8.TCHAR - это тип символов, который «плавает» между 8 и 16 битами в зависимости от флагов времени компиляции.Файлы UTF-8 используют от одного до четырех байтов для представления каждого символа.Итак, вы, вероятно, хотите сохранить текст как std::wstring объекты, но вам нужно явно преобразовать UTF-8 в строки wstring.

Но, если вы просто хотите получить что-нибудь работает, сосредоточьтесь на своем токенизации.Вам нужно хранить адрес начала каждого токена (как TCHAR*), но вместо этого ваш вектор является вектором TCHAR s.Когда вы пытаетесь использовать данные токена, вы приводите указатели TCHAR s к TCHAR*, что является неудивительным результатом нарушений доступа.Ваш AV-адрес 0x0000006c, который является кодом ASCII для символа l.

  vector<TCHAR*> cells;
  ...
  cells.push_back(pch);

... и затем ...

    TCHAR *original_document = cells[column_holding_doc];
    TCHAR *pc = _tcstok(original_document," ");
...