2.12.9. ファイル#
2.12.9.1. ファイルの読み取り#
C++ でファイルを読み込む場合、C 言語と同様に fopen や fclose を利用することもできますが、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