C ++字符串不重新分配

时间:2017-03-13 15:15:21

标签: c++ string append allocation

我在C ++中有一个客户端/服务器应用程序。服务器向客户端发送一个相当大的文件(27KB)。客户端从套接字中读取1024字节的固定长度,然后我将其连接到一个字符串。但是,当我使用+ =运算符时,它似乎不会分配超过4048个字节,我最终在客户端使用4KB文件。

客户代码:

#define BUFFER_SIZE 1024
string outStr="";
char buf[BUFFER_SIZE];
while(1){
    int numread;
    if ((numread = read(clientSocket, buf, sizeof(buf) -1)) == -1){
        fprintf(stderr,"Error: reading from socket");   
        exit(1);
    }
    fprintf(stderr,"received answer with numread: %d\n",numread);   
    if (numread == 0){
        break;
    }   
    buf[numread] = '\0';
    outStr+=buf;
}   
fprintf(stderr,"Transmission is over with total length: %d\n",outStr.length()); 

我得到的输出是:

26次:

received answer with numread: 1023

之后:

received answer with numread: 246
received answer with numread: 0
transmission is over with total length: 4048

输出确认整个文件已传输,但串联不允许我追加4048的(系统限制?)。但是,当内容需要更大时,c ++字符串应自动重新分配其内存。那为什么会这样呢?

谢谢你的回答。

2 个答案:

答案 0 :(得分:2)

您可以使用str::append(重载4号)并显式提供要追加的字节数。这将正确地附加空字节。所以,而不是:

buf[numread] = '\0';
outStr+=buf;

DO

outStr.append(numread, buf);

答案 1 :(得分:0)

字符串结束于' \ 0'因此,如果来自套接字的字节数组具有类似的结果,当您在响应字符串的末尾连接时,它将只连接到该点。所以我认为你应该使用std :: vector来存储整个响应。