Pergunta

Existe outra maneira de converter QFile em File?Diferente disso:

QFile myFile("goforward.raw");
int FileDescriptor = myFile.handle();
FILE* fh = fdopen(FileDescriptor, "rb");
Foi útil?

Solução

Acho que você já sabe que tem vários open, read, etc.métodos em QFile.Dito isto, se o arquivo não for aberto, então o handle método retorna um erro.

QFile myFile("goforward.raw");
myFile.open(QIODevice::ReadOnly);
int fileHandle = myFile.handle();

Depois disso, você pode reabri-lo com:

FILE* fh = fdopen(fileHandle, "rb");

Outras dicas

Tivemos problemas muito estranhos com nosso aplicativo e finalmente atribuímos isso ao problema QFile/fdopen:

void foo(QString filename)
{
    QFile qf(filename);
    qf.open(QIODevice::ReadOnly);
    int fd = qf.handle();
    FILE* f = fdopen(fd, "rb");
    // do some stuff with f
    fclose(f); // !!! undefined behaviour !!!
}

O problema com este código é que fclose(f) é chamado antes do objeto QFile ser destruído, que é a ordem errada: QTBUG-20372

...então destrua o objeto QFile antes de chamar fclose() ou duplique o descritor de arquivo retornado por QFile::handle():

void foo(QString filename)
{
    QFile qf(filename);
    qf.open(QIODevice::ReadOnly);
    int fd = qf.handle();
    FILE* f = fdopen(dup(fd), "rb"); // !!! use dup()
    // do some stuff with f
    fclose(f); // correct
}

P.S.:Esses problemas estranhos com nosso aplicativo apareceram apenas em poucos sistemas devido a um atraso de 10 segundos entre uma instrução de retorno no final de uma função e o retorno real dessa função.Foi muito estranho.Então este é um exemplo de um “comportamento indefinido” manifestado no mundo real :o)

Se você tem o nome do arquivo, por que simplesmente não usa

QFile *file = fopen(filename.toLocal8Bit().data(), "rb");

?

Não é muito mais simples do que criar o QFile, abri-lo, recuperar o identificador, etc.?

E é bastante livre de bugs...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top