カテゴリ: C# 更新日: 2025/12/05

C#でバイナリファイルを読み書きする方法(BinaryReader・BinaryWriter)

C#でバイナリファイルを読み書きする方法(BinaryReader・BinaryWriter)
C#でバイナリファイルを読み書きする方法(BinaryReader・BinaryWriter)

先生と生徒の会話形式で理解しよう

生徒

「先生、C#で画像や数値データをファイルに保存したり、読み込んだりする方法ってありますか?」

先生

「良い質問ですね。C#では『バイナリファイル』を扱うことで、文字だけでなく、数値や画像などのデータも保存・読み込みできるんですよ。」

生徒

「バイナリファイルって、テキストファイルとは違うんですか?」

先生

「そうです。テキストファイルは文字が読めますが、バイナリファイルは『0と1のデータのかたまり』なので、人間には読めません。その代わり、データを正確に保存できるという特徴があります。」

生徒

「なるほど。じゃあ、そのバイナリファイルをC#で扱うにはどうすればいいですか?」

先生

「C#には BinaryWriterBinaryReader という便利なクラスが用意されています。それを使えば簡単に読み書きできますよ!」

1. バイナリファイルとは?

1. バイナリファイルとは?
1. バイナリファイルとは?

バイナリファイルとは、データを「0と1(バイナリデータ)」の形で保存したファイルのことです。例えば、画像ファイル(.jpgや.png)、音声ファイル(.mp3)などもバイナリデータでできています。

テキストファイルのように人間が読むことはできませんが、プログラムが扱うには効率的で正確な形式です。C#では、数値・文字列・真偽値などをまとめて保存できるのが特徴です。

2. BinaryWriterを使ってデータを書き込む

2. BinaryWriterを使ってデータを書き込む
2. BinaryWriterを使ってデータを書き込む

BinaryWriterは、バイナリデータをファイルに書き込むためのクラスです。数値や文字列をそのままの形式で保存できるため、文字化けなどの心配がありません。

使い方はとても簡単で、ファイルを開いて Write() メソッドでデータを書き込むだけです。


using System;
using System.IO;

class Program
{
    static void Main()
    {
        // バイナリファイルにデータを書き込む
        using (BinaryWriter writer = new BinaryWriter(File.Open("data.bin", FileMode.Create)))
        {
            writer.Write(123);            // 整数
            writer.Write(3.14);           // 小数
            writer.Write(true);           // 真偽値
            writer.Write("こんにちは");   // 文字列
        }

        Console.WriteLine("バイナリファイルにデータを書き込みました。");
    }
}

バイナリファイルにデータを書き込みました。

using文を使うことで、ファイルを自動的に閉じてくれます。FileMode.Createは、ファイルがなければ新しく作り、すでにある場合は上書きします。

3. BinaryReaderを使ってデータを読み込む

3. BinaryReaderを使ってデータを読み込む
3. BinaryReaderを使ってデータを読み込む

BinaryReaderは、バイナリファイルに保存されたデータを読み込むためのクラスです。ReadInt32()ReadString()など、型に応じたメソッドでデータを取り出します。


using System;
using System.IO;

class Program
{
    static void Main()
    {
        // バイナリファイルからデータを読み込む
        using (BinaryReader reader = new BinaryReader(File.Open("data.bin", FileMode.Open)))
        {
            int number = reader.ReadInt32();
            double pi = reader.ReadDouble();
            bool flag = reader.ReadBoolean();
            string message = reader.ReadString();

            Console.WriteLine($"整数: {number}");
            Console.WriteLine($"小数: {pi}");
            Console.WriteLine($"真偽値: {flag}");
            Console.WriteLine($"文字列: {message}");
        }
    }
}

整数: 123
小数: 3.14
真偽値: True
文字列: こんにちは

ポイントは、書き込んだ順番で読み込むことです。順番が違うとデータの種類が合わず、正しく読み取れません。

4. バイナリファイルとテキストファイルの違い

4. バイナリファイルとテキストファイルの違い
4. バイナリファイルとテキストファイルの違い

初心者の方がよく混乱するのが、バイナリファイルとテキストファイルの違いです。以下のような特徴があります。

  • テキストファイル:人間が読める形式(例:「123」「こんにちは」など)
  • バイナリファイル:コンピューターが扱いやすい形式(例:画像・音声・プログラムデータなど)

テキストファイルはメモ帳などで中身を確認できますが、バイナリファイルを開くと意味不明な記号のように見えます。これは、文字としてではなく「生のデータ」として保存されているからです。

5. バイナリファイルの活用例

5. バイナリファイルの活用例
5. バイナリファイルの活用例

バイナリファイルは、次のような場面でよく使われます。

  • ゲームのセーブデータの保存
  • アプリケーション設定情報の保存
  • 画像・音声・動画データの読み込み
  • 通信データの送受信

例えば、プレイヤーのスコアやレベルなどをバイナリ形式で保存すれば、読み込みも高速で、改ざんされにくくなります。テキストファイルよりも効率的にデータを扱えるのがメリットです。

6. ファイル操作時の注意点

6. ファイル操作時の注意点
6. ファイル操作時の注意点

バイナリファイルを扱う際に注意すべきポイントもあります。

  • ファイルの読み書き順番を間違えない
  • 異なる型で読み取らない(例:書き込み時にintで、読み込み時にstringで読むとエラー)
  • ファイルを開いたら必ず閉じる(usingで自動的に閉じるのが安全)

これらを守ることで、安全かつ正確にデータを保存・読み込むことができます。

7. BinaryReaderとBinaryWriterを使いこなそう

7. BinaryReaderとBinaryWriterを使いこなそう
7. BinaryReaderとBinaryWriterを使いこなそう

今回学んだように、C#ではBinaryReaderBinaryWriterを使うことで、テキストではなくバイナリ形式のデータを簡単に扱うことができます。これらを使いこなせば、設定ファイルやゲームデータなど、幅広い場面で応用できるようになります。

まとめ

まとめ
まとめ

今回の記事では、C#でバイナリファイルを読み書きするために欠かせないBinaryReaderとBinaryWriterの基本的な使い方や、テキストファイルとの違い、さらに実際の活用場面について幅広く確認してきました。バイナリデータは文字ではなく「機械が扱うための情報」で構成されているため、画像や音声、動画、設定情報など幅広いジャンルで活用されています。こうした特徴を理解したうえでBinaryReaderとBinaryWriterを使いこなすと、専用形式のデータを正しい順序で保存し、高速な読み出しを行えるようになります。 バイナリファイルの書き込みでは、BinaryWriterを使って整数や小数、真偽値、文字列といった複数の型を混在させながら保存できる柔軟性があり、データをそのままの形式で扱えるため、テキストファイルでは表現しづらい内容も正確に残すことができます。一方で読み込みを行うBinaryReaderでは、Writeで保存した順番の通りにReadメソッドを使わなければ、正しいデータを取り出せないという重要なポイントがあり、この規則性をしっかり理解しておくことで、より安全で正確なデータ管理が実現できます。 また、テキスト形式とバイナリ形式の違いを整理することで、用途に応じたファイル形式の選択ができるようになり、C#におけるデータ処理の幅が広がります。たとえば、ゲームのセーブデータやアプリケーションの設定情報の保存では、軽量で高速なバイナリ形式がよく選ばれます。背景には、バイナリファイルがデータ構造をそのまま保持できること、読まれることを前提としていないため改ざんされにくいことなど、実務上のメリットが多くあるからです。 以下には、今回の学びを踏まえて、複数のデータをまとめて保存し読み込みまで行うサンプルプログラムを少し拡張した形で紹介します。実際の処理とともに、学んだ概念を整理し直せる内容になっています。

サンプルプログラム:複数のデータをまとめて保存して読み込む例


using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "sampleData.bin";

        // データを書き込む
        using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Create)))
        {
            writer.Write(456);
            writer.Write(9.81);
            writer.Write(false);
            writer.Write("さようなら");
        }

        // データを読み込む
        using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
        {
            int number = reader.ReadInt32();
            double gravity = reader.ReadDouble();
            bool flag = reader.ReadBoolean();
            string message = reader.ReadString();

            Console.WriteLine($"整数: {number}");
            Console.WriteLine($"小数: {gravity}");
            Console.WriteLine($"真偽値: {flag}");
            Console.WriteLine($"文字列: {message}");
        }
    }
}

このサンプルでは、整数、小数、真偽値、文字列という異なる種類のデータを順番通りにバイナリ形式で保存し、読み込み時も同じ順序で取り出しています。今回の記事で触れてきたように、書き込みと読み込みの対応関係を正確に守ることで、ファイル内部のデータ構造が乱れず、意図したとおりの読み出しができます。こうしたファイル処理の基本は、アプリケーション設計の中でも重要であり、動作の安定性にも大きく関わる部分です。バイナリ形式を扱い慣れていくことで、より高速で安全なデータ保存ができるようになり、実務でも活躍の幅が広がるでしょう。

先生と生徒の振り返り会話

生徒

「先生、バイナリファイルの保存方法って最初は難しそうに感じたけど、順番を守れば意外とシンプルなんですね。」

先生

「そうですね。BinaryWriterとBinaryReaderの組み合わせはとても扱いやすく設計されています。書き込み順と読み込み順をきちんとそろえれば、複雑なデータでも正しく扱えますよ。」

生徒

「画像や音声データも読み書きできるというのが驚きでした。テキストだけじゃないんですね。」

先生

「その通りです。文字だけでなく、数値や設定情報なども効率よく保存できます。特にゲームやアプリの設定管理ではバイナリがよく使われます。」

生徒

「書き込みと読み込みの型を間違えないようにするのが大事だとよく分かりました。次はもっと複雑なデータ構造にも挑戦してみたいです!」

先生

「良い心がけですね。今回の基礎を押さえておけば、配列や構造体のバイナリ保存にも応用できますよ。次のステップも頑張っていきましょう。」

カテゴリの一覧へ
新着記事
New1
C#
C#のデフォルト引数と名前付き引数の使い方を解説!初心者でも安心のやさしい入門
New2
C#
C#のオブジェクト初期化子を完全ガイド!初心者でもわかる便利な使い方
New3
COBOL
COBOLの帳票出力と編集を完全マスター!条件付き表示で分かりやすい書類を作る方法
New4
COBOL
COBOLの帳票出力を完全攻略!数値項目のカンマ・小数点編集例を徹底解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.2
Java&Spring記事人気No2
C#
C#でJSONファイルを読み書きする方法(JsonSerializer・Newtonsoft.Json)
No.3
Java&Spring記事人気No3
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.4
Java&Spring記事人気No4
C#
C#のLINQクエリ構文の書き方と基本操作をマスターしよう
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#のLINQ(リンク)とは?基本概念とデータ操作を初心者向けに徹底解説!
No.7
Java&Spring記事人気No7
C#
C#の非同期処理とUIスレッドをマスター!WPF/WinFormsでアプリが止まる問題を解決
No.8
Java&Spring記事人気No8
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法