【发布时间】:2016-05-07 20:18:22
【问题描述】:
我是 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解析为stringvector的部分。
有没有办法读取二进制格式并按行拆分,对每一行进行字符串处理,然后将它们写入二进制输出?
顺便说一句,我在 Linux 上运行它。
【问题讨论】:
-
原则上,每个文件都是二进制文件,因为这正是计算机的工作方式。现在,说“我正在尝试逐行阅读”显然意味着您将其视为文本文件。现在,如果它是一个文本文件,这可能不是问题,但如果它是一个没有任何换行符的大文件,你可能只是用完了所有的 RAM。
-
顺便说一下,
argv[0]通常是你程序的可执行文件名,不是在运行时指定的第一个参数。 -
吹毛求疵,但是:这不会编译。请确保 100% 确保您发布的代码与您可以自己尝试的代码相同。
-
@PaulMcKenzie:抱歉,这不对。 LF 字符是\n。如果您在 Windows 上,变量
line将有一个尾随\r字符,但仅此而已。 (有些旧的 Mac 中的行由\r而不是\n分隔,但 OP 不太可能在其中一个上处理 30GB 文件。还有一些文件系统确实是没有行尾字符 - 但我敢打赌他也没有使用其中之一。) -
@PaulMcKenzie 不。我为与您相矛盾而感到难过,但在这种情况下文件模式无关紧要。
getline被明确告知分隔符是什么。
标签: c++ binary ifstream getline ofstream