2.12.9. ファイル#
2.12.9.1. ファイルの読み込み#
C++ におけるファイルの読み込みでは、C 言語と同様に fopen 関数や fclose 関数を利用することもできますが、ifstream ライブラリーの機能を利用するとより簡潔に記述できます。次の例は、アミノ酸配列や塩基配列などを保存した FASTA ファイルを読み込む例です。
2.12.9.1.1. char[] 型の利用#
ファイルを開き、1 行ずつ char* 型として読み込む場合は、あらかじめ char 型配列の長さを指定しておく必要があります。この FASTA ファイルでは 1 行が 80 文字で構成されているため、改行文字も含めて読み込み用の char[] のサイズを 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 型の利用#
ファイルの内容を 1 行ずつ 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. ファイルの書き出し#
ファイルへの書き出しには 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;
}
// #>1ALK:A|PDBID|CHAIN|SEQUENCE
// #TPEMPVLENRAAQGNITAPGGARRLTGDQTAALRNSLSDKPAKNIILLIGDGMGDSEITAARNYAEGAGGFFKGIDALPL
// #TGQYTHYALNKKTGKPDYVTDSAASATAWSTGVKTYNGALGVDIHEKDHPTILEMAKAAGLATGNVSTAELQDATPAALV
// #...