プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

C++/CLIでテキストファイルからテキストデータを読み込む。

f:id:paveway:20190914064630j:plain

はじめに

テキストファイルの読み込みですが、他の言語のJava、Objective-CやSwiftで同じような処理を行ったことがあるので、見当をつけて調べました。

StreamReaderクラス

StreamReaderクラスを使えば、テキストファイルを読み込めます。
読み込み方は3種類あります。
各Readメソッドを実行すると、文字読み込み位置が進みますので注意してください。

メソッド名 機能
Read 現在の文字読み込み位置から1字読み込みます、1文字分文字読み込み位置を進めます。終端に達すると-1が返却されます。
ReadLine 現在の文字読み込み位置から1行読み込み、1行分文字読み込み位置を進めます。読み込んだ文字列に改行文字は含まれません。終端に達するとnullptrが返却されます。
ReadToEnd 現在の文字読み込み位置から終端まで文字列を読み込みます。
void ReadTextFile(String^ path)
{
    // finally節でCloseするため、StreamReaderの変数定義はtryブロックの外で行います。
    StreamReader^ sr = nullptr;
    try
    {
        // StreamReaderを生成します。
        // 今回はファイル名だけ指定して行います。この場合、文字エンコーディングはUTF8Encodingになります。
        // その他の生成方法についてはAPI Referenceを参照してください。
        sr = gcnew StreamReader(path);

        // ①1文字ずつ読み込みます。
        int ch = -1;
        while ((ch = sr->Read()) != -1)
        {
            // 読み込んだ文字の処理
        }

        // ②1行ずつ読み込みます。
        String^ line = nullptr;
        while ((line = sr->ReadLine()) != nullptr)
        {
            // 読み込んだ文字列の処理
        }

        // ③終端まで読み込みます。
        String^ text = sr->ReadToEnd();
    }
    catch (Exception^ e)
    {
        // 例外発生時の処理を記述します。
        // 発生する例外ごとに処理したい場合は、それぞれの例外のcatch節を用意して処理してください。
    }
    finally
    {
        // リソースを確実に開放するため、finally節でStreamReaderをクローズします。
        if (sr != nullptr)
        {
            sr->Close();
        }
    }
}

API Reference
StreamReaderクラス

おわりに

予想通り他の言語と同じようなStreamReaderクラスが用意され、同じような読み込みメソッドが用意されていました。
ただ全部読み込めるReadToEnd()メソッドは、他の言語でみた記憶がありませんが、用途によっては便利だと感じました。
今回は単純にファイル名の指定だけでファイルをオープンしましたが、文字エンコーディングを指定したり、ファイルを排他/共有で開いたりする場合は、StreamReaderクラスのコンストラクタで指定できます。
この辺りはまたの機会に調べたいと思います。

もうひとりで頑張らない。TOEICオンラインコーチスタディサプリENGLISH