FRAM(/dev/mtdblock4)のデバイスファイルをQFileで開き
seekで所定の位置まで移動して、wirteでデータを書く
という流れの処理をしています。
コンパイルのQtバージョンは5.3.2で、実行環境もQt5.3.2
の状態でアプリを起動すると、seekを呼んでいるところで
QIODevice::seek: Cannot call seek on a sequential device
というエラー?警告?文が表示されます。
言葉通りなら
シーケンシャルデバイスではシークできないよと言っているのだと思います。
確かにQtのドキュメントにも
For sequential devices, the default behavior is to do nothing and return false.
と書いているため、シーケンシャルデバイスの場合何もしないということになります。
seekの戻り値がfalseになっていたことも確認済みです。
しかし、実際にFRAMの中身を見てみると
しっかりとシークをした位置にデータを書き込んでいることが確認できました。
というかそもそもFRAMはランダムアクセスだと思うので、前提の部分でおかしいです。
isSequentialを呼んでみるとfalseが返ってくるため、しっかりとランダムアクセスデバイスとして
認識は出来ているみたいです。
また、コンパイルしたものはそのままで実行環境をQt5.7.1で実行してみると
問題の警告文が表示されなくなります。
このことからQtのバグなのではと推測したのですが
これに関するバグレポートや修正に関する文書が見つけられず困っています。
これがただ単に間違って警告が出てしまうだけだというなら、
表示される警告を無視、出来れば表示しないようにしてそのままQFileのseekを使い続けようと思っているのですが
他に致命的なバグが存在するようなのであれば、C++の関数に処理を書き換えようと思っております。
何かコレに関する情報をご存知の方、ちょっとしたことでもいいので教えていただけませんでしょうか?
よろしくお願いします。
###追記
Qt5.3.2のソースを見ていたところ
C++
1bool QIODevice::isSequential() const 2{ 3 return false; 4}
というのを見つけました
つまりどんな状況でもfalseしか返さないので、実質シーケンシャルデバイスを認識するのは不可能?
そうなってくるとなぜ警告文が出てくるのか、なおさら分からなくなってしまいました...
###追記2
QFile::seek() on character devices not working
該当の問題だと思われるバグのページを見つけていました...
割と最初に見つけていたのに勝手に勘違いしてスルーしていました...
恐らくこれだと思われるので
今一度、検討をしてみたいと思います
回答2件
あなたの回答
tips
プレビュー