hakeの日記

Windows環境でプログラミングの勉強をしています。

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");
	}
}