以块读取(文本)文件

时间:2014-03-27 16:03:51

标签: c++ io

我目前正在使用c ++进行I / O操作,我遇到了以一定大小(如1024字节)的块读取和/或写入数据的方法,而不是一次整个文件。现在我脑子里有一些关于这个概念的问题:

  1. 这有什么好处?是否只是因为一次可以读取多少字节的限制?或者这会显着提高速度吗?它可能只用于套接字连接,或者用于预先知道大小的文件吗?
  2. 如果这对所有类型的文件类型都有用(比如包含配置值的文本文件),我该如何正确处理块?请参阅下面的示例:
  3. 想象一下这样的结构配置文件:

    [Engine]
    bloom = true
    AA = 16
    [Keys]
    jump = SPACE
    quit = ESCAPE
    

    现在我读到的一个块包含这个:

    [Engine]
    bloom = true
    AA = 16
    [Keys]
    jump = SP
    

    所以我的块不够大,无法完全存储最后一行。如果我现在将此块与我的配置读取器类一起使用,它将检测到该行,但是值不正确。 如何确保正确处理? 也许我在这里完全错误的道路,但我希望得到一些澄清。

1 个答案:

答案 0 :(得分:1)

您认为这是您可以做出的某种选择,但事实并非如此:文件数据始终以块的形式读取。唯一的问题是在哪个层的抽象层是连接成单个输出的块,供业务逻辑使用?是在你的用户空间"代码或隐藏在标准库函数后面?因此,你的大部分问题都没有实际意义。

但是,如果 可以使用标准库函数隐藏该逻辑,那么它会为您节省一些手持代码。

比较一下:

#include <string>
#include <fstream>

std::string readFromStream(std::istream& is)
{
   std::string result;

   char x;
   while (is.get(x))
      str += x;

   return result;
}

std::ifstream t("file.txt");
std::string str = readFromStream(t);

(或读取1024字节块的等价物 - 逻辑大致相同),用此:

#include <string>
#include <fstream>
#include <streambuf>

std::ifstream t("file.txt");
std::string str((std::istreambuf_iterator<char>(t)),
                 std::istreambuf_iterator<char>());