2.12.9. ファイル#

2.12.9.1. ファイルの読み取り#

C++ でファイルを読み込む場合、C 言語と同様に fopenfclose を利用することもできますが、C++ 標準ライブラリの ifstream を使うとより簡潔に記述できます。ここでは、アミノ酸配列や塩基配列などを保存した FASTA ファイルを読み込む例を示します。

2.12.9.1.1. char[] 型の利用#

ファイルを開き、1 行ずつ char* 型として読み込む場合は、あらかじめ char 型配列の長さを指定しておく必要があります。FASTA ファイルでは 1 行が 80 文字で構成されていることが多いため、改行文字も含めて配列のサイズを 81 に設定しています。

#include <fstream>
#include <iostream>
#include <string>

int main()
{
    std::ifstream ifs("./data/1alk.fa");

    int buf_size = 81;
    char str[buf_size];

    if (ifs.fail()) {
        std::cerr << "Failed to open file." << std::endl;
        return -1;
    }

    while (ifs.getline(str, buf_size)) {
        std::cout << "#" << str << std::endl;
    }

    return 0;
}
// >1ALK:A|PDBID|CHAIN|SEQUENCE
// TPEMPVLENRAAQGNITAPGGARRLTGDQTAALRNSLSDKPAKNIILLIGDGMGDSEITAARNYAEGAGGFFKGIDALPL
// TGQYTHYALNKKTGKPDYVTDSAASATAWSTGVKTYNGALGVDIHEKDHPTILEMAKAAGLATGNVSTAELQDATPAALV
// ...

2.12.9.1.2. string 型の利用#

string 型を使う場合は、1 行の長さを事前に指定する必要がありません。そのため、行の長さが不定でも柔軟に対応できます。

#include <fstream>
#include <iostream>
#include <string>

int main()
{
    std::ifstream ifs("./data/1alk.fa");
    std::string str;

    if (ifs.fail()) {
        std::cerr << "Failed to open file." << std::endl;
        return -1;
    }

    while (getline(ifs, str)) {
        std::cout << "#" << str << std::endl;
    }

    return 0;
}
// >1ALK:A|PDBID|CHAIN|SEQUENCE
// TPEMPVLENRAAQGNITAPGGARRLTGDQTAALRNSLSDKPAKNIILLIGDGMGDSEITAARNYAEGAGGFFKGIDALPL
// TGQYTHYALNKKTGKPDYVTDSAASATAWSTGVKTYNGALGVDIHEKDHPTILEMAKAAGLATGNVSTAELQDATPAALV
// ...

2.12.9.2. ファイルの書き出し#

ファイルへの書き出しには、C++ 標準ライブラリの ofstream を利用します。次の例では、新しい FASTA 形式のファイルを作成し、配列データを書き込んでいます。

#include <fstream>
#include <iostream>
#include <string>

int main()
{
    std::ofstream ofs("./seq.fa");
    
    ofs << ">seq1" << std::endl;
    ofs << "ACAGTGTGACTTAGCTGTAC" << std::endl;

    ofs << ">seq2" << std::endl;
    ofs << "CCCGGCTTTTATGAG" << std::endl;

    return 0;
}
// seq.fa
// >seq1
// ACAGTGTGACTTAGCTGTAC
// >seq2
// CCCGGCTTTTATGAG