QFile/FILE*: Как правильно закрыть ручку?

Мне нужно открыть файлы с QFile а также QString для многоязычного без волос Но мне также нужно управлять данными этих файлов через std::stream API. Как многие предполагают, я использовал std::fstream stdFile(fdopen(qtFile.handle(), mode)); сделать это.

Однако я столкнулся с проблемой при повторяющихся операциях. После определенного объема обработки файлов приложение вылетает.

Следующий код может воспроизвести сбой:

int fileOperationCount = 0;
while (true)
{
    QFile qtFile("plop.txt");
    qtFile.open(QIODevice::ReadOnly);
    std::ifstream file = std::ifstream(fdopen(qtFile.handle(), "rb"));

    if (!file.good())
        throw std::exception();
    file.seekg(0, file.beg);
    if (!file.good())
        throw std::exception(); //Will ALWAYS trigger at fileOperationCount = 509

    qtFile.close();

    fileOperationCount++;
}

509-й рухнет после seekg, Это также происходит, если бы я манипулировал сотнями разных файлов. 509-й раз, когда я пытаюсь прочитать файл, любой файл, он все равно потерпит крах.

Есть идеи, что я делаю не так?

1 ответ

Решение
   int fileOperationCount = 0;
    while (true)
    {
        std::ifstream file ("plop.txt",std::ios::in);

        if (!file.good())
            throw std::exception();
        file.seekg(0, file.beg);
        if (!file.good())
            throw std::exception();

        file.close();
        fileOperationCount++;
    }

эта версия работает, если файл существует, если он не file.good() ложно из-за eof (я думаю). Если вы хотите использовать Qt для перевода, вы можете использовать

            std::ifstream file (QObject::tr("plop.txt"),std::ios::in);

или если функция находится внутри QObject, просто используйте tr("..") для лучшего контекста.

Другие вопросы по тегам