如何使用 fread() 输入一个巨大的 txt 并将其放入字符串流中?

How to input a huge txt using fread() and put it into a stringstream?

我正在尝试将一个巨大的 txt 文件(大约 5 MB)输入到字符串流中,但我遇到了定义 fread() 的问题。我知道,在这里,我必须使用一个字符串来放置由 fread() 创建的字符串。这是我的代码,我不知道我的错误在哪里。我急切地等待解决方案。

FILE *f;

string buffer;
f = fopen("input.txt", "r");
fread(buffer, 1, buffer.size(), f);

stringstream s(buffer);

我认为你应该像下面这样使用 read,如果你转而使用 fread,否则 C++ STL 提供了更好的方法来做同样的事情。

文件 *f;

char buffer[1024];
std::stringstream s;
f = fopen("input.txt", "r");
while (fread(buffer, 1, 1024, f))
{
    s<<buffer;
}


std::cout<<s.str();

假设您没有充分的理由不使用 C++ 标准 I/O 流,那么您可以这样做:

#include <iostream>

void process_file() {
  std::stringstream s;
  {
    std::ifstream in("input.txt");
    s << in.rdbuf();
  }
  ...
}

再一次,您可能想问自己为什么要将文件内容放入字符串流中,而不是直接使用 ifstream...

如果出于某种原因你不想使用 C++ I/O 流,你可以像这样让它以 C 风格工作:

void process_file() {
  stringstream s;
  // your buffer is going to be allocated on the stack, so you may want to keep it relatively small
  constexpr size_t BUFFER_SIZE = 1024; 
  char buffer[BUFFER_SIZE];
  FILE *f = fopen("input.txt", "r");
  while (fread(buffer, 1, BUFFER_SIZE, f))
  {
    s<<buffer;
  }
  fclose(f);
  ... 
}

你的代码不是c++,而是纯c,在c++中你可以:

std::fstream f("input.txt", "r");

之后你可以像stringstream一样使用f而不需要任何额外的代码