c++ - 在 C++ 中逐行读取二进制文件

标签 c++ binary ifstream getline ofstream

我是 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'\0x000xFF .所以基本上,您正在查看 ingrain wallpaper试着找出里面的字母。

但是,根据您对我们正在讨论的文件的说明,它们实际上是仅包含文本的文件。

所以你的问题似乎在于单行可能超过你在 std::string 中可用的存储空间。 .这是一种罕见的情况——但它似乎可能发生在基因串上。出色地。

让自己熟悉 C++ 具有的非面向文本的文件 I/O。基本上,有 ifstream.read()并且您应该使用它来获取(有限的)字节数,进行处理,写入输出,重复。注意输入中的换行符,如果您已经阅读过它,请“倒带”您的文件 ( fseek )。

另外,我真的很想知道你的台词需要多长时间才能中断 std::string .我猜你可能在一些非常有限的操作系统(32 位?)或计算机(非常小的 RAM + Swap?)上运行。

关于c++ - 在 C++ 中逐行读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37093276/

相关文章:

binary - 找到 0 数量等于 1 数量的第一个位置的位技巧

assembly - 为什么 ARM 区分 SDIV 和 UDIV,而不区分 ADD、SUB 和 MUL?

C++:如何查看正在读取的文件的下一个字符以比较字符?

c++ - 2D vector - 通过搜索删除行

c++ - 学习嵌入式 C/C++ 开发的最佳评估套件是什么?

c++ - 在遍历 vector 时使用什么索引

c++ - 从 C++ 文件中读取包含 std::vector 的对象

Java JNI - 将 C 中分配的资源与 java 对象相关联?

python - 如何将多索引数据帧(python)中的行的十进制值转换为二进制值?

c++ - 如何从 C++ 中的文本文件正文中获取特定的单词和行