好的,下面是一些代碼,概述了我想要做的事情。有效地將一個標準流複製到另一個標準流
#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
應該明確包含多行輸入。
任何想法?