2012-02-27 40 views
3

是否有另一種將QFile轉換爲File的方式?與此不同:將QFile轉換爲FILE *

QFile myFile("goforward.raw"); 
int FileDescriptor = myFile.handle(); 
FILE* fh = fdopen(FileDescriptor, "rb"); 
+3

爲什麼你需要這個?你不能簡單地使用'QFile'進行文件操作嗎? – 2012-02-27 13:24:47

+0

什麼不適合你在那裏? – Mat 2012-02-27 13:28:35

+0

因爲我使用這個函數:png_init_io(png_ptr,fh);第二個參數是File *。謝謝你可以使用代碼,但我喜歡使用唯一的庫QFile。 – Jjreina 2012-02-27 13:29:26

回答

7

我想你已經知道你有各種openread等在一個QFile方法。也就是說,如果文件沒有打開,那麼handle方法會返回一個錯誤。

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

之後,你可能會重新打開:

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

我們有很奇怪的問題,我們的應用程序,並最後將其追溯到一個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 !!! 
} 

的此代碼的問題在於,在QFile對象被銷燬之前調用fclose(f),這是錯誤的順序:QTBUG-20372

...所以要麼調用FCLOSE前銷燬掉一個QFile對象()或重複)通過QFile時返回的文件描述符::句柄(:

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 
} 

PS:我們的應用程序的那些奇怪的問題出現了只在很很少有系統在函數結束時的返回語句與該函數的實際返回之間延遲10秒。這真的很奇怪。所以這是一個「不確定的行爲」在現實世界中表現的一個例子:)如果您有文件名,你爲什麼不乾脆用

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

Ø

+0

如果您在'f'之前關閉'qf'會怎麼樣?你可以繼續使用'f'嗎? – 2017-07-30 21:42:39

0

是不是比創建QFile,打開它,檢索句柄等更簡單?

而且這是非常沒有bug ...

+0

這不會編譯: 「錯誤:無法在初始化中將'FILE * {aka _IO_FILE *}'轉換爲'QFile *'」 – 2016-09-16 11:22:54

相關問題