2011年12月10日土曜日

( Qt C++ )テキストデータの1文字づつの読込


近いうちにWebプログラミングを始めようと思っている。
言語はどれにしようか迷ったのだがPHPにしようと思う。PHPの入門書を買わなきゃなぁ。あぁまた出費。しょうがないか...。
Qtアプリ開発も行っているのですが、なんていうかここぞというところで部品や関数がないので手間取っている。tr()...もう自動でやってくんないかなぁ。_TEXT()みたいでめんどくさい。OS選ばないのはいいんだけど、ところどころでプログラム組みづらいなぁと感じています。まぁ文句あんなら使うなって話なんですけど...。

はい、話を戻します。今日はテキストデータの1文字づつの読込をメモします。GUI Programming with Qt4のサンプルを使用します。流れとしてはファイルを1文字づつ読込、各行の末尾のスペースを除去し、タブをスペースに変換したものを書き出すという流れです。区切って見れば簡単です。
ではコードを

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

void tidyFile(QIODevice *inDevice, QIODevice *outDevice)
{
    QTextStream in(inDevice);
    QTextStream out(outDevice);

    const int TabSize = 8;//タブサイズ
    int endlCount = 0;//改行カウント
    int spaceCount = 0;//スペースカウント
    int column = 0;//処理中の現在のカラム位置
    QChar ch;
   
    while (!in.atEnd())
    {
        in >> ch;//ここで一文字取り出し

       if (ch == ’\n’)
        {
            ++endlCount;
            spaceCount = 0;
            column = 0;
        }
        else if (ch == ’\t’)
        {
            int size = TabSize - (column % TabSize);
            spaceCount += size;
            column += size;
        }
        else if (ch == ’ ’)
        {
            ++spaceCount;
            ++column;
        }
        else
        {
            while (endlCount > 0)
            {
                out << endl;
                --endlCount;
                column = 0;
            }
            while (spaceCount > 0)
            {
                out << ’ ’;
                --spaceCount;
                ++column;
            }
            out << ch;
            ++column;
        }
    }
    out << endl;
}


宣言部は説明不要ですね。そのまんまです。宣言後ループに入っています。ループはin.atEnd()を条件にしています。(つまりファイルの終わりまでループしたら抜けるということ)その後in >> ch;で一文字取り出し、あとは各条件分岐で対象文字を変更するか、書き込むかしています。

以上です。次は久しぶりにQt以外かな。