ファイルの読み書きというのはWindowsアプリケーションを作成していると必ずといっ
て良いほど発生する作業です。
テキストファイルを読んできて、手を加えて出力するという流れをつかむことが出来れ
ば、かなり強力な武器となります。
しかも、それほど難しいものではありません。
C#でファイルを扱うにはStreamReader/StreamWriterクラスを使用します。
C++でいえば、ifstream/ofstreamのようなものです。
このクラスを使用するには、コードの上のほうに、using System.~等が記述してある
場所に、
using System.IO;
を、追加します。
何処でもかまいませんが、コメントを入れておくと、自分で追加したことが分かってよ
いかと思います。
まずはファイルの読み込みから行きましょうか。
まず、例によって新規プロジェクトでWindowsアプリケーションを作成します。
一旦「ファイル→全てのファイルを保存」を実行してください。
次に、適当なファイル名のテキストファイルを作成します。
特に拘りが無いのであれば、伝統的な「hoge.txt」にでもしておくと良いでしょう。
作成する場所はプロジェクトを保存したフォルダのbin\debug\フォルダになります。
テキストファイルを作成したならば、英語で何か文章を書いてください。
英語がダメってひとは別にABCDでも良いですが。
ここでは「The first and last words out of your sewers will be "Sir!"」に、して
おきます。
例によって、フォームにラベルと、ボタンを貼り付けます。
ボタンクリック時のイベントを以下のようにします。
例
private void button1_Click(object sender, EventArgs e)
{
string text;
StreamReader sr = new StreamReader("hoge.txt");
text = sr.ReadLine();
label1.Text = text;
sr.Close();
}
StreamReaderは、文字通り、ストリームからの読み込みクラスです。
クラスなので、newでインスタンス化しなければなりません。
ストリームというのは、基本的な入出力の事で、ファイルに限らずネットワークやメモ
リからの入出力にも使用します。
ここではStreamReaderクラスのコンストラクタにファイル名を渡してやり、ファイル用
のインスタンスを作成/初期化しています。
ファイルを開きたいときは、インスタンスを生成するときにファイル名を指定すると覚
えておけばよいでしょう。
StreamReaderクラスの、ReadLineメソッドは、ファイルから一行分文字列を読み込み、
読み込んだ文字列を返します。
この例では読み込んだ文字列をtextに保存。
保存したtextをlabelのプロパティーにコピーしています。
最後に、使用したストリームをクローズしています。
実行してみましょう。
ボタンを押下すると、テキストファイルに書き込んだ文字列が、画面に表示されるはず
です。
ファイルが無いというエラーが表示された場合は、テキストファイルを置いたフォルダ
を確認してください。
さて、テキストの中身は英語で、と書きました。
何故だかわかりますか?
ためしに、日本語の文字列をテキストファイルに書き込んで同じプログラムを走らせて
見ましょう。
特殊なテキストエディタを使っているのでなければ、恐らく正常に動作しないはずです。
これは、C#の文字列はUnicodeであるこに起因します。
つまり、読み出すファイルをUnicodeにしなければなりません。
ですが、困ったことに日本語のWindows環境ではShift JISが多用されています。
Shift JISの文字列を正常に読み込むには、ファイルストリームを開く際、エンコーディ
ングを指定して対象の文字コードがShift JISであることを知らせる必要があります。
エンコーディングを指定するには、Encordingクラスを使用します。
例
StreamReader sr = new StreamReader("hoge.txt", Encoding.GetEncoding("shift_jis"));
EncordingクラスのGetEncodingメソッドは、指定したコードページID/コードページ名か
らエンコーディングを取得するメソッドです。
コードページID/コードページ名というのはエンコーディングに割り当てられたIDと名前
です。
例えば、Shift JISのコードページIDは932、コードページ名はshift_jisです。
GetEncodingメソッドに文字列を渡すとコードページ名で、数値を渡すとコードページID
からエンコーディングを返してくれます。
ためしにGetEncodingに932を渡してみましょう。同じ動きをするはずです。
逆のパターン、ファイルの書き込みです。
例
private void button1_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("hoge2.txt", false , Encoding.GetEncoding(932));
sw.WriteLine("にゃんこ");
sw.Flush();
sw.Close();
}
書き込みとは2点ほど違うところがあります。
一つは、上書きか、追記かを示すフラグを付加できます。
エンコーディングを指定する際は必須になります。
trueを指定すると、ファイルが存在しない場合は新規に作成、ファイルが存在する場合
はファイルの最後に追記します。
falseを指定すると、ファイルが存在しない場合は新規に作成、ファイルが存在する場
合は再作成します。
ためしにtrueを指定して、ボタンを何回か押してみましょう。
押した数だけにゃんこが書かれているはずです。
もう一つは、Flushの存在です。
Write/WriteLineメソッドを呼んでもその場でファイルに書き込むわけではありません。
Flushメソッドを呼び出すことでファイルへ書き込みを行います。
実はCloseメソッドを呼んでも書き込みをしてくれますが、ここでは一応明示的に書き
込み処理を記述しています。
最終更新:2007年10月23日 12:46