QFileをファイルに変換する別の方法はありますか?これとは異なる:QFileをFILEに変換する*
QFile myFile("goforward.raw");
int FileDescriptor = myFile.handle();
FILE* fh = fdopen(FileDescriptor, "rb");
QFileをファイルに変換する別の方法はありますか?これとは異なる:QFileをFILEに変換する*
QFile myFile("goforward.raw");
int FileDescriptor = myFile.handle();
FILE* fh = fdopen(FileDescriptor, "rb");
私はあなたがすでになど様々なopen
、read
、qfileにより内のメソッドを持っていることを知っていると思います。つまり、ファイルが開かれていない場合、handle
メソッドはエラーを返します。その後
QFile myFile("goforward.raw");
myFile.open(QIODevice::ReadOnly);
int fileHandle = myFile.handle();
、あなたがそれを再度開くことがあります
FILE* fh = fdopen(fileHandle, "rb");
我々は、我々のアプリケーションで非常に奇妙な問題を抱えていたし、最終的に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)
'f'の前に' qf'を閉じるとどうなりますか?その後、 'f'を続けてもいいですか? –
ファイル名を持っている場合は、なぜあなたは単に
QFile *file = fopen(filename.toLocal8Bit().data(), "rb");
を使用していませんか?
QFileの作成、開く、ハンドルの取得などは簡単ではありませんか?
そして、それはかなりバグフリーです...
これはコンパイルされません: "エラー:初期化で 'FILE * {aka _IO_FILE *}'を 'QFile *'に変換できません" –
なぜこれが必要ですか?ファイル操作に 'QFile'を単に使うことはできませんか? –
あなたはそこに何を持っているとうまくいかないのですか? – Mat
私はこの関数を使用しています:png_init_io(png_ptr、fh); 2番目のパラメータはFile *です。ありがとう、はい、そこでコードを使用するが、私は唯一のライブラリQFileを使用するのが好きです。 – Jjreina