スポンサーリンク
C#

C# ファイルの読み書き(StreamReader/StreamWriter)

スポンサーリンク
スポンサーリンク

C#では、いろいろな「ファイル」を扱いますが、今回は一番よく使われる「テキストファイル」の読み書きについて書きます。
ファイルアクセスのためのクラスは、C#では「System.IO名前空間」のクラスで行うことができます。

 

ファイルへのアクセスの基本

C言語などでは、

  1. ファイルを開く
  2. データを(読み込む/書き込む)
  3. ファイルを閉じる

の順で処理を行います。
C#でも基本は同じですが、「1.ファイルを開く」と「3. ファイルを閉じる」は、C言語ほどはっきり見えません。
ですが、C#の場合、逆にこの部分は「フレームワークがやってくれている」と思っていい部分でもあります。

 

ファイルからテキストを読み取る

ファイルからテキストを読み取るには「System.IO.StreamReader」で行います。

下記がサンプルです。

static void Main(string[] args)
{
    string file_path = System.IO.Path.Combine(@".\test.txt");
    if (!System.IO.File.Exists(file_path))
    {
        return;
    }
    // ファイルからデータを読み取る
    string file_data = string.Empty;    // ファイルのデータ
    using (System.IO.StreamReader sr = new System.IO.StreamReader(file_path))   // UTF-8のテキスト用
    //using (System.IO.StreamReader sr = new System.IO.StreamReader(file_path, Encoding.GetEncoding("shift-jis")))  // シフトJISのテキスト用
    {
        file_data = sr.ReadToEnd(); // ファイルのデータを「すべて」取得する
    }
    Console.WriteLine(file_data);
}

 

このサンプルでは、”test.txt”というテキストファイルのデータを読み取るのですが、気を付けていただきたいのは「日本語」でデータを作るときの文字コードは「UTF-8」で作るようにしてください。
テキストファイルの日本語が「UTF-8」でないと表示で文字化けしてしまいます。

 

ファイルへテキストデータを書き込む

ファイルからテキストデータを書き込むには「System.IO.StreamWriter」で行います。

下記がサンプルです。

static void Main(string[] args)
{
    string file_path = System.IO.Path.Combine(@".\test.txt");
    // ファイルへテキストデータを書き込む
    string file_data = "データその1\r\nデータその2\r\n";    // ファイルのデータ
    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(file_path))   // UTF-8のテキスト用
    //using (System.IO.StreamWriter sw = new System.IO.StreamWriter(file_path, Encoding.GetEncoding("shift-jis")))  // シフトJISのテキスト用
    {
        sw.Write(file_data); // ファイルへテキストデータを出力する
    }
}

 

このサンプルでテキストデータを出力すると、テキストデータは「UTF-8」で出力されます。

ここで重要なのは、ファイルの読み書きには「文字コード」の指定があり、現在のC#で取り扱う標準の文字コードは「UTF-8」で、C#のソースコードも文字コードは「UTF-8」です。

 

ファイルはいつ開いていつ閉じている?

上記のサンプルコードで「ファイルはいつ開いていつ閉じているのか」という疑問があると思います。
このサンプルコードの場合は、はっきりしています。
行でいうと using( … ) { の行でファイルを開き、この using のブロックが閉じるところで、ファイルを閉じています。
StreamReaderやStreamWriterから言うと、オブジェクトを生成したときにファイルを開き、オブジェクトを破棄するときにファイルを閉じています。

 

タイトルとURLをコピーしました