2011年12月3日土曜日

( Qt C++ )バイナリデータの書き込み



はい、今日でC++ GUI Programming with Qt4は6日目です。
特に変わらずに基本的事項を頭に入れていっています。こちらはあと2日で終わりそうです。

さて、今日からは表題のような、よく使う,ファイルの入出力関係をメモしていこうと思います。
今日はバイナリデータの書き込みです。うだうだ書くより実践です。まずはコード

(C++ GUI Programming with Qt4 274ページより)

QImage image("philip.png");

QMap<QString, QColor> map;
map.insert("red", Qt::red);
map.insert("green", Qt::green);
map.insert("blue", Qt::blue);

QFile file("facts.dat");

if (!file.open(QIODevice::WriteOnly)) //オープン成功か失敗か
{
    return;
}

QDataStream out(&file);//バイナリ読み書きに使う
out.setVersion(QDataStream::Qt_4_1);//version番号。定数を入れても良い。
out << quint32(0x12345678) << image << map;


このコードはint, QImage, QMap<QString, QColor>をfacts.datという出力するというもの。最初のほうはただの宣言類ですので、今回の理解にはあまり重要ではありません。

out.setVersion(QDataStream::Qt_4_1)のところは、違うバージョンで読むときを考えてQDataStream::Qt_3_0などと記述することもできます。バージョンの違いにより読込に影響をあたえることがあるのでここは注意が必要です。

で最後に out << quint32(0x12345678) << image << mapと書いて書き込んでいますが、ここでquint32( ... )しているのは整数をどのOSでも正確に符号なし32ビット値として書き込まれるようにするためだそうです。

QDataStreamはデフォルトでデータをビックエンディアンで格納するそうです。またバイトオーダはsetByteOrder()で変更が可能だそうです。以下リファレンスより、

void QDataStream::setByteOrder ( ByteOrder bo )

The bo parameter can be QDataStream::BigEndian or QDataStream::LittleEndian.

(boにはどっちかいれろよ。みたいな意味)

 

以上です。 次回はバイナリ読込をメモ。

 

2011年12月2日金曜日

( Qt C++ )GUI Programming with Qt4 4~5日目

はい、今日はQtの4~5日目。
予定通りペースダウン。10ページほど遅れています。
でまぁ内容ですが、ほとんど基本的な設定のことばかり。まぁ本の表題に沿った内容にするならばこれしか書きようがないんでしょうけど正直飽きてきます。さっさと終わらせて次にいったほうがいいですね。ということでこれからペースを上げていきます。あと3日で終わらせ、Qtによるアプリ開発へ移ります。

2011年12月1日木曜日

( C# )GetFilesによる複数拡張子のファイル取得

※新しい記事に「( C# )フォルダ以下の特定の拡張子のファイルをすべて取得する」を追加してあります。こちらを見たほうが楽かもしれません。

今日はC#
 複数拡張子フィルタリングによるファイル取得は
ただ単にGetFiles(path, searchpattern);を繰り返して、後で配列を結合させればできるのだが、キャッシュに入るので速度は速いらしいが何度も書くのは何か気持ちが悪い。
他の方法が無いか探してみると一応あるにはあった。linqを使う方法である。

Regex regex = new Regex(@".*\.jpg|.*\.JPG|.*\.Jpg");
IEnumerable<string> files = null;
files = from file in Directory.GetFiles(currentDir) where regex.IsMatch(file) select file;

これでコードはスッキリするのだが、速度が遅すぎて使い物にならない。正規表現が足を引っ張っているようだ。
そこで少し改良して以下のようにした。

Func<string, bool> func = new Func<string, bool>(where);
IEnumerable<string> file_temp = null;
IEnumerable<string> files = null;
file_temp = Directory.GetFiles(currentDir);
files = Enumerable.Where<string>(file_temp, func);
/*... 省略  ...*/
public bool where(string name)
{
     string temp_name3 = null;
     try
     {
         temp_name3 = name.Remove(0, name.Length - 4);
         temp_name3 = temp_name3.ToLower();
         if (temp_name3.Equals(".jpg") || temp_name3.Equals(".tif") || temp_name3.Equals(".bmp"))
         {
              return true;
         }
         string temp_name4 = name.Remove(0, name.Length - 5);
         temp_name4 = temp_name4.ToLower();
         if (temp_name4.Equals(".jpeg") || temp_name4.Equals(".tiff"))
         {
              return true;
          }
      }
      catch
      {
              return false;
      }
      return false;
}

これでかなりマシな速度になった。最速ではないのだろうが、まぁ許容範囲であろう。一応メモ。