좋아, 다음은 내가하려고하는 것을 개략적으로 설명하는 코드이다.하나의 std 스트림을 다른 스트림으로 효율적으로 복사하기
#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 개체에 기록하여 한 번에 한 줄씩 제거 할 수 있습니다.
나는 stringstream에 get (streambuf &) 메서드를 사용하여 한 줄을 다른 stringstream에 쓰고 출력 할 수 있다고 생각했습니다.
내가 읽은 버퍼에서 한 번에 한 줄을 추출하는 가장 좋은 방법이 아닐 수 있다는 사실을 무시한다. (내가 여기에 올린 사람에게 더 나은 대안을 제시하고 싶지만) , 처음으로 이 ss
이라고 불리는 순간 실패 상태에 있으며 나는 그 이유를 알 수 없습니다. 입력 파일에 많은 데이터가 있으므로 ss
에는 반드시 두 줄 이상의 입력이 있어야합니다.
아이디어가 있으십니까?