C++でQTアプリ(その5) テキストファイルのアクセス
テキストファイルの読み書きをしてみる。ファイルリードボタンを押すと/home/zaurus/Documents/sjis.txtの内容をテキストエリアebに表示、ファイルライトボタンを押すとテキストエリアの内容を/home/zaurus/Documents/sjis2.txtへ出力する。
アクセスするファイルの文字コードはQTextCodecで指定する。ファイルへのアクセスは QTextStreamを介して行う。ストリームを使用することで行単位の読み込みや「<<」を用いての出力が可能になる。ファイルリードについてはQFileのリファレンスの例題をそのまま使用した。
テキストエリアebの行数が多い場合は、eb->textをストリームにして1行ずつ出力した方が良いのかもしれない。
QTesxtCodecは各スロットではなくコンストラクタで文字コードを定義して使用したかったのだけど、やり方が不明。
以下余談、C++は文字列の扱いが大変っていうイメージがあったのだけれども、QTのクラスを扱う限りではかなりRubyライクなプログラミングができている。これがコンソールアプリを作るとなると、こんなにお気楽にはできないのだろうなぁ。
textfile.h
#ifndef TEXTFILE_H #define TEXTFILE_H #include <qmainwindow.h> #include <qtextcodec.h> #include <qfont.h> #include <qvbox.h> #include <qhbox.h> #include <qmultilineedit.h> #include <qpushbutton.h> #include <qfile.h> #include <qtextstream.h> class TextFile : public QMainWindow{ Q_OBJECT public: TextFile(QWidget *parent = 0, const char *name = 0); // ~TextFile(); private: QTextCodec* codec; QVBox *v; QHBox *h; QMultiLineEdit *eb; QPushButton *pbr; QPushButton *pbw; private slots: void slot_readTextFile(); void slot_writeTextFile(); }; #endif
textfile.cpp
#include "textfile.h" TextFile::TextFile(QWidget *parent, const char *name) : QMainWindow(parent, name) { codec = QTextCodec::codecForName("ShiftJIS"); setCaption("TextFile Acces"); QFont f("lcfont",18); setFont(f); // Widget内のフォント設定 v = new QVBox( this ); setCentralWidget(v); eb = new QMultiLineEdit( v ); // テキストエリア eb->clear(); h = new QHBox( v ); pbr = new QPushButton(tr("ファイルリード"), h); pbw = new QPushButton(tr("ファイルライト"), h); connect( pbr, SIGNAL(clicked()), this, SLOT(slot_readTextFile()) ); connect( pbw, SIGNAL(clicked()), this, SLOT(slot_writeTextFile()) ); // textfile = new QFile("/home/zaurus/Documents/sjis.txt"); } void TextFile::slot_readTextFile() { // QTextCodec* codec = QTextCodec::codecForName("ShiftJIS"); QFile textfile("/home/zaurus/Documents/sjis.txt"); eb->clear(); if ( textfile.open(IO_ReadOnly) ){ QTextStream t( &textfile ); t.setCodec( codec ); QString s; while ( !t.eof() ) { s = t.readLine(); // 一行ずつ読む eb->insertLine(s); } textfile.close(); }else{ eb->insertLine("Can't Open File"); } } void TextFile::slot_writeTextFile() { // QTextCodec* codec = QTextCodec::codecForName("ShiftJIS"); QFile textfile2("/home/zaurus/Documents/sjis2.txt"); if ( textfile2.open(IO_WriteOnly) ){ QTextStream t( &textfile2 ); t.setCodec( codec ); t << eb->text() << "\n"; textfile2.close(); }else{ eb->insertLine("Can't Open File"); } }