QFile/FILE* : 如何正确关闭句柄?
QFile/FILE* : How to properly close the handle?
我需要使用 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 而为 false(我认为)。如果你想使用 Qt 进行翻译,你可以使用
std::ifstream file (QObject::tr("plop.txt"),std::ios::in);
或者如果函数在 QObject 内部,则只使用 tr("..") 以获得更好的上下文。
我需要使用 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 而为 false(我认为)。如果你想使用 Qt 进行翻译,你可以使用
std::ifstream file (QObject::tr("plop.txt"),std::ios::in);
或者如果函数在 QObject 内部,则只使用 tr("..") 以获得更好的上下文。