我是 C++ 的初学者,希望您能多多包涵。
尝试读取一个文本格式的文件,每行都有如下所示的行(前几行,称为标题行):
@HD VN:1.5 SO:queryname
或者像这样
read.1 4 * 0 0 * * 0 0 CAACCNNTACCACAGCCCGANGCATTAACAACTTAANNNCNNNTNNANNNNNNNNNNNNTTGAAAAAAAAAAAAAAAAAA A<.AA##F..<F)<)FF))<#A<7<F.)FA.FAA.)###.###F##)############)FF)A<..A..7A....<F.A XC:Z:CAACCNNTACCA RG:Z:A XQ:i:2
两者都是制表符分隔的。
文件非常大,因此是二进制格式。 我想知道是否可以从二进制格式文件中读取每一行,对该行进行一些处理,然后将其写入二进制格式输出文件。
我从这段代码开始:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
string input_file = argv[1];
string output_file = argv[2];
string line;
ifstream istream;
istream.open(input_file.c_str(),ios::binary|ios::in);
ofstream ostream;
ostream.open(output_file.c_str(),ios::binary|ios::out);
while(getline(istream,line,'\n')){
if(line.empty()) continue;
//process line assuming it is read as a string
ostream<<line<<endl;
}
istream.close();
ostream.close();
}
但它崩溃了:Segmentation fault (core dumped)
,在我试图将 line
解析为 string
的部分 vector
。
有没有办法读取二进制格式并将其按行拆分,对每一行进行字符串处理,然后将它们写入二进制输出?
顺便说一句,我在 Linux 上运行它。
最佳答案
Is it possible to read a binary file line by line?
原则上,每个文件都是二进制的,因为计算机就是这样工作的。现在,说“我正在尝试逐行阅读”显然意味着您将其视为文本文件——“行”是一个文本概念。
The file is very large and therefore is in binary format.
这是一流的废话。大小不会改变文件的格式。
How do I get each line as a string? Does the
ostream<<line<<endl;
work for writing a string to a binary file?
是和否:如果您的文件不是 文本文件,为什么这些 '\n'
很重要?字符是?对于非文本文件,这些只是普通字节,如 'a'
或 \0x00
或 0xFF
.所以基本上,您正在查看 试着找出里面的字母。
但是,根据您对我们正在讨论的文件的说明,它们实际上是仅包含文本的文件。
所以你的问题似乎在于单行可能超过你在 std::string
中可用的存储空间。 .这是一种罕见的情况——但它似乎可能发生在基因串上。出色地。
让自己熟悉 C++ 具有的非面向文本的文件 I/O。基本上,有 ifstream.read()
并且您应该使用它来获取(有限的)字节数,进行处理,写入输出,重复。注意输入中的换行符,如果您已经阅读过它,请“倒带”您的文件 ( fseek
)。
另外,我真的很想知道你的台词需要多长时间才能中断 std::string
.我猜你可能在一些非常有限的操作系统(32 位?)或计算机(非常小的 RAM + Swap?)上运行。
关于c++ - 在 C++ 中逐行读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37093276/