好的,下面是一些代码,概述了我想要做的事情。有效地将一个标准流复制到另一个标准流
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <iostream>
#include <sstream>
int main(int c, char *v[])
{
int fd = open("data.out", O_RDONLY | O_NONBLOCK);
std::cout << "fd = " << fd << std::endl;
char buffer[ 1024000 ];
ssize_t nread;
std::stringstream ss;
while(true)
{
if ((nread = read(fd, buffer, sizeof(buffer) - 1)) < 0)
break;
ss.write(buffer, nread);
while(true)
{
std::stringstream s2;
std::cout << "pre-get : " <<
(((ss.rdstate() & std::ios::badbit) == std::ios::badbit) ? "bad" : "") << " " <<
(((ss.rdstate() & std::ios::eofbit) == std::ios::eofbit) ? "eof" : "") << " " <<
(((ss.rdstate() & std::ios::failbit) == std::ios::failbit) ? "fail" : "") << " " <<
std::endl;
ss.get(*s2.rdbuf());
std::cout << "post-get : " <<
(((ss.rdstate() & std::ios::badbit) == std::ios::badbit) ? "bad" : "") << " " <<
(((ss.rdstate() & std::ios::eofbit) == std::ios::eofbit) ? "eof" : "") << " " <<
(((ss.rdstate() & std::ios::failbit) == std::ios::failbit) ? "fail" : "") << " " <<
std::endl;
unsigned int linelen = ss.gcount() - 1;
if (ss.eof())
{
ss.str(s2.str());
break;
}
else if (ss.fail())
{
ss.str("");
break;
}
else
{
std::cout << s2.str() << std::endl;
}
}
}
}
它首先将大块数据读入数据缓冲区。我知道有更好的C++方法来完成这一部分,但在我的真实应用程序中,我传递了一个char []缓冲区和一个长度。
然后,我将缓冲区写入std :: stringstream对象,以便我可以一次删除一行。
我想我会使用字符流中的get(streambuf &)方法将一行写入另一个字符串流,然后我可以输出它。
忽略这样的事实,这可能不是从缓冲区中一次提取一行的最佳方法我已阅读过(尽管我希望任何人都可以提供一个更好的替代方案来发布此处发布的内容) ,只要第一个被称为ss
处于失败状态,我不能解决原因。输入文件中有大量数据,因此ss
应该明确包含多行输入。
任何想法?