繁体   English   中英

C ++ read() - 从套接字到ofstream

[英]C++ read()-ing from a socket to an ofstream

是否有一种C / C ++方法使用read()从套接字读取数据并使接收缓冲区是文件(ofstream)或类似的自扩展对象(例如)?

编辑:当我考虑如何读取可能接收10000+字节文件的内容的流套接字时出现了问题。 我从来没有像把20000或50000字节(现在足够大)放在堆栈上作为缓冲区,文件可以临时存储,直到我可以插入文件。 为什么不直接将其直接流入文件中以加注星标。

就像你可以在std:string里面的char *那样,我想到了类似的东西

read( int fd, outFile.front(), std::npos );  // npos = INT_MAX

或类似的东西。

结束编辑

谢谢。

这是简单的,并且在我的手指之上,但我认为沿着这些方向的东西会成功:

template <unsigned BUF_SIZE>
struct Buffer {
    char buf_[BUF_SIZE];
    int len_;
    Buffer () : buf_(), len_(0) {}
    int read (int fd) {
        int r = read(fd, buf_ + len_, BUF_SIZE - len_);
        if (r > 0) len_ += r;
        return r;
    }
    int capacity () const { return BUF_SIZE - len_; }
}

template <unsigned BUF_SIZE>
struct BufferStream {
    typedef std::unique_ptr< Buffer<BUF_SIZE> > BufferPtr;
    std::vector<BufferPtr> stream_;
    BufferStream () : stream_(1, BufferPtr(new Buffer<BUF_SIZE>)) {}
    int read (int fd) {
        if ((*stream_.rbegin())->capacity() == 0)
            stream_.push_back(BufferPtr(new Buffer<BUF_SIZE>));
        return (*stream_.rbegin())->read(fd);
    }
};

在评论中,您提到您想避免创建一个大的char缓冲区。 当使用read系统调用时,执行一些大读取而不是许多小读取通常更有效。 因此,大多数实现将选择大输入缓冲区来获得该效率。 你可以实现类似的东西:

std::vector<char> input;
char in;
int r;
while ((r = read(fd, &in, 1)) == 1) input.push_back(in);

但这将涉及系统调用,并且每个输入字节至少复制一个字节。 相反,我提出的代码避免了额外的数据副本。

我真的不希望我提出的代码是你要采用的解决方案。 我只想向您提供如何创建一个空间和时间效率相当高的自扩展对象的说明。 根据您的目的,您可能希望扩展它,或编写自己的。 在我的头顶,一些改进可能是:

  • 使用std::list代替,以避免向量调整大小
  • 允许API一个参数来指定要读取的字节数
  • 使用readv始终允许至少BUF_SIZE字节(或多于BUF_SIZE字节)在同一时间内读

看一下boost::asio中的流支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM