Мне нужно открыть файлы с 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-й раз, когда я пытаюсь прочитать файл, любой файл, он все равно потерпит крах.
Есть идеи, что я делаю не так?
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 («..») для лучшего контекста.