Какой самый быстрый способ прочитать файл, полный строк (разделенных символом новой строки) в массиве беззнаковых массивов символов (и наоборот)? - PullRequest
0 голосов
/ 22 октября 2011

Ну, возможно, название немного вводит в заблуждение.Все, что я хочу, чтобы вы сделали, это быстро взгляните на следующие два фрагмента и дайте мне несколько советов о том, как максимально повысить производительность, не получая слишком экзотический код.Код необходим для работы только на win32.К сожалению, контейнеры STL сейчас не подходят.

Чтобы прочитать файл ...

bool TextFile::Read(const char *pFilePath)
{
    bool            bSuccess    = false;
    std::ifstream   oFile(pFilePath, std::ios_base::in);

    if(oFile.is_open())
    {
        std::string stLineNow;
        std::size_t siLineLength;

        if(this->pLines)
        {
            this->Clear();
        }

        this->stFilePath = pFilePath;

        oFile.seekg(0, std::ios::end);
        this->pLines = new unsigned char *[static_cast<unsigned int> (oFile.tellg())];
        oFile.seekg(0, std::ios::beg);

        for(this->ulLinesCount = 0; std::getline(oFile, stLineNow).good(); this->ulLinesCount++)
        {
            siLineLength = stLineNow.length() + 1;
            this->pLines[this->ulLinesCount] = new unsigned char[siLineLength];
            memcpy(this->pLines[this->ulLinesCount], stLineNow.c_str(), siLineLength);
        }

        bSuccess = true;

        oFile.close();
    }

    return bSuccess;
}

... и сохранить его ...

bool TextFile::Save(const char *pFilePath)
{
    bool bSuccess = false;

    if(this->pLines)
    {
        std::ofstream oFile(pFilePath ? pFilePath : this->stFilePath, std::ios_base::out);

        if(oFile.is_open())
        {
            for(unsigned long ulPosition = 0; ulPosition < this->GetCount(); ulPosition++)
            {
                oFile << this->Get(ulPosition) << '\n';
            }

            bSuccess = true;

            oFile.close();
        }
    }

    return bSuccess;
}

... и извините за уродливое форматирование.

Заранее спасибо!

1 Ответ

4 голосов
/ 22 октября 2011

Ну ... я бы сделал следующее:

  • Используйте отображенные в памяти файлы.Это самый быстрый способ чтения файлов;
  • Затем memcpy() все содержимое файла в новом буфере;
  • Затем один раз пропустите через буфер и посчитайте новые строки;
  • Создайте в массиве столько указателей, сколько есть новых строк;
  • Выполните через буфер в другой раз, и на этот раз:
    • Замените первый байт каждой новой строки на 0.
    • Поместить указатель на начало каждой строки в массиве указателей.

Вуаля!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...