1

我正在尝试为一个类实现 GoBackN ARQ。我正在尝试读取文件,将其分成 30 个字符的数据包,然后将数据包存储在数据包数组中。所有这些数据包都是class packet.

目前,此代码编译并运行,但是当我访问数据包数组时,在数组的索引 0 处我收到最后一个和最近的数据包。当我尝试访问索引 1 时,我期望一个不同的数据包,但是,所有索引中的数据包都是相同的。

为什么我所有数据包中的数据都相同?

int numPackets = 0;
packet *packetArray[30];

void addPacket(packet *p)
{
    for (int i = 0; i < 30; i++)
    {
        if (packetArray[i])
        {
            continue;
        }
        else
        {
            packetArray[i] = p;
            numPackets++;
            break;
        }
    }
}

int main(int argumentCount, char *argumentVariables[]) {

    char buffer[1024];

    std::ifstream infile (argumentVariables[1], std::ifstream::binary);
    infile.seekg (0, infile.end);
    int lengthOfFile = infile.tellg();
    infile.seekg (0, infile.beg);

    int iterator = 0;
    while(1)
    {
        if (lengthOfFile > 30)
        {
            bzero(buffer, 1024);
            infile.read(buffer, 30);
            lengthOfFile -= 30;
            addPacket(new packet(1, iterator, strlen(buffer), buffer));
            iterator++;
        }
        else
        {
            bzero(buffer, 1024);
            infile.read(buffer, 30);
            addPacket(new packet(1, iterator, strlen(buffer), buffer));
            break;
        }
    }

    packet * sendpckt = packetArray[0];
    sendpckt->serialize(sendPayload);
    printf("%s\n", sendPayload);

    infile.close();

    return 0;
}

的构造函数代码class packet

packet::packet(int t, int s, int l, char * d){
    type = t;
    seqnum = s;
    length = l;
    data = d;
}
4

1 回答 1

0

你能显示类“数据包”的构造函数代码吗?首先,我认为您必须在“infile.read(buffer, 30)”之后的缓冲区末尾添加一个 '\0',然后检查您是复制缓冲区还是仅将缓冲区的地址复制到“数据包”成员.

于 2017-03-26T20:40:47.630 回答