2012-02-27 7 views
3

QFileをファイルに変換する別の方法はありますか?これとは異なる:QFileをFILEに変換する*

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

なぜこれが必要ですか?ファイル操作に 'QFile'を単に使うことはできませんか? –

+0

あなたはそこに何を持っているとうまくいかないのですか? – Mat

+0

私はこの関数を使用しています:png_init_io(png_ptr、fh); 2番目のパラメータはFile *です。ありがとう、はい、そこでコードを使用するが、私は唯一のライブラリQFileを使用するのが好きです。 – Jjreina

答えて

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:我々のアプリとのそれらの奇妙な問題は、非常にのみ現れましたいくつかのシステムでは、関数の最後のreturn文とその関数からの実際の戻り値の間に10秒の遅延があります。それは本当に奇妙だった。だから、これは現実の世界で明らかに「未定義の動作」の一例である:O)

+0

'f'の前に' qf'を閉じるとどうなりますか?その後、 'f'を続けてもいいですか? –

0

ファイル名を持っている場合は、なぜあなたは単に

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

を使用していませんか?

QFileの作成、開く、ハンドルの取得などは簡単ではありませんか?

そして、それはかなりバグフリーです...

+0

これはコンパイルされません: "エラー:初期化で 'FILE * {aka _IO_FILE *}'を 'QFile *'に変換できません" –

関連する問題