Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 |

2006-05-02(Tue)

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

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20060502/p1
リンク元