【问题标题】:Easiest way to read a null terminate string with istream?使用 istream 读取空终止字符串的最简单方法?
【发布时间】:2011-07-14 18:05:40
【问题描述】:

我有一个 istream,我需要准确读取特定数量的字节,但我不知道它的长度。它是空终止的。我在想我可以 1)写一个循环并一次读取一个字节 2)告诉它返回一个缓冲区或字符串,从现在开始直到某个字节(在这种情况下为 0)。或 3) 一次只读入一个字节,检查它是否为 0,如果不是,则将其附加到字符串。

我知道我可以做到的第 3 个,但其他 2 个听起来可能使用 istream(在这种情况下是文件流)。我仍在阅读 istream 的文档。有很多。

【问题讨论】:

    标签: c++ istream


    【解决方案1】:

    编号 2) 可以使用 getline methodistream

    std::istream is = ...;
    
    const int MAX_BUFFSIZE = 512;
    char buffer[MAX_BUFFSIZE];
    
    is.getline(buffer, MAX_BUFFSIZE, '\0');    // Get up to MAX_BUFFSIZE - 1 bytes until the first null character (or end of stream)
    

    请注意,这会从输入流中删除分隔符(空字符),但不会将其附加到缓冲区(这是本示例中 getline()get() 之间的区别)。但是,空字符会自动附加到缓冲区中;因此,最后一个字节将包含空字符,但将从流中删除。

    【讨论】:

      【解决方案2】:

      看起来像重载:

      istream& get (char* s, streamsize n, char delim ); 
      

      来自http://www.cplusplus.com/reference/iostream/istream/get/ 将解决您的问题;将'\0' 设为delim。还有一个版本(显示为http://www.cplusplus.com/reference/string/getline/)将返回std::string

      【讨论】:

        【解决方案3】:

        既然你不知道它的长度,最简单的方法是:

        std::string strBuf;
        std::getline( istream, strBuf, '\0' );
        

        【讨论】:

        • 您实际上需要使用 '\0' 而不是 0。否则您的代码无法按预期工作。我也有点想不通
        • @acidzombie24:应该没有区别(\0 的 ASCII 值是 0),除非在你的库中有一个 getline() 的重载,它接受 int 作为第三个参数。你遇到了什么错误?
        • 我确定这与 int VS char 重载有关。这是一个示例 codepad.org/YRDKVmNs 与您的 int 示例 codepad.org/KwIjtaof
        • @acidzombie:嗯,它似乎无法将int 自动转换为char,我认为这在一般情况下是有道理的,因为它们的大小不同。很高兴知道!我关于过载的理论是完全错误的。
        • @acidzombie, @cameron:从“没有按预期工作”我认为它在运行时有问题。 Tnx 进行更正。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-19
        • 2010-11-06
        • 2015-12-26
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多