如何实现可以通过换行分割的流

时间:2015-04-23 14:06:10

标签: c++ c newline zlib unzip

以下代码可以正常工作,但与使用向(修改过的)程序提供解压缩数据的(linux)管道相比,效率低两倍。我需要在程序中有一个稳定的流,我可以按\n分开。有没有办法使用(字符串?)流或任何其他技巧?

int main(int argc, char *argv[]) {
static const int unzipBufferSize = 8192;
long long int counter = 0;
int i = 0, p = 0, n = 0;
int offset = 0;
char *end = NULL;
char *begin = NULL;
unsigned char unzipBuffer[unzipBufferSize];
unsigned int unzippedBytes;
char * inFileName = argv[1];
char buffer[200];
buffer[0] = '\0';
bool breaker = false;
char pch[4][200];
Read *aRead = new Read;
gzFile inFileZ;
inFileZ = gzopen(inFileName, "rb");
while (true) {
    unzippedBytes = gzread(inFileZ, unzipBuffer, unzipBufferSize);
    if (unzippedBytes > 0) {
        unzipBuffer[unzippedBytes] = '\0'; //put a 0-char after the total buffer
        begin = (char*) &unzipBuffer[0]; // point to the address of the first char
        do {
            end = strchr(begin,(int)'\n'); //find the end of line
            if (end != NULL) *(end) = '\0'; // put 0-char to use it as a c-string
            pch[p][0] = '\0'; \\ put a 0-char to be able to strcat
            if (strlen(buffer) > 0) { // if buffer from previous iteration contains something
                strcat(pch[p], buffer); // cat it to the p-th pch
                buffer[0] = '\0'; \\ set buffer to null-string or ""
            }
            strcat(pch[p], begin); // put begin (or rest of line in case there was a buffer into p-th pch

            if (end != NULL) { // see if it already points to something
                begin = end+1; // if so, advance begin to old end+1
                p++;
            }

            if(p>3) { // a 'read' contains 4 lines, so if p>3
                strcat(aRead->bases,pch[1]); // we use line 2 and 4 as
                strcat(aRead->scores,pch[3]); // bases and scores
                //do things with the reads
                aRead->bases[0] = '\0'; //put them back to 0-char
                aRead->scores[0] = '\0';
                p = 0; // start counting next 4 lines
            }

        } 
        while (end != NULL );
        strcat(buffer,pch[p]); //move the left-over of unzipBuffer to buffer
    }
    else {
        break; // when no unzippedBytes, exit the loop
    }
}

2 个答案:

答案 0 :(得分:0)

您的主要问题可能是标准的C字符串库。

使用System.IO.Compression.Zipfile.ExtractToDirectory(zipPath,newFp);个功能,您将在每个调用中多次遍历完整缓冲区 ,首先针对strxxx(),然后针对strchr(),然后针对每个调用strlen()次来电。 使用标准库是一件好事,但在这里,它只是效率低下。

尝试一下,你能想出一些简单的东西,只触及每个角色一次(代码只是为了显示原理,不要指望它有效):

strcat()

答案 1 :(得分:0)

我试图让它工作,但它只是在运行时给出了分段错误:

do {
    unzippedBytes = gzread(inFileZ, unzipBuffer, unzipBufferSize);
    if (unzippedBytes > 0) {

        while (*unzipBuffer < unzippedBytes) {
            *pch = *unzipBuffer++;
            cout << pch;

            i++;
        }
        i=0;
    }
    else break;
} while (true);

我在这里做错了什么?