【发布时间】:2011-01-06 06:47:24
【问题描述】:
好的,这里有一些代码概述了我正在尝试做的事情。
#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.get( *s2.rdbuf() ) 被调用,ss 就处于失败状态,我不知道为什么。输入文件中有大量数据,所以ss 肯定包含不止一行输入。
有什么想法吗?
【问题讨论】: