我有一个包含26000行或记录的文本文件。 每条记录包含128个字节的十六进制数据。
我需要一次拔出4条记录,将其放入另一个数据结构并将其发送到套接字
以下是代码段
std::string array[26000];
char* char_ptr = NULL;
char data[512];
for(int index = 0; index < 26000; index += 4)
{
// copy data
char_ptr = &(array[index]);
memcpy(&data, char_ptr, sizeof(data));
// send data on socket
}
这只会给字符串数组中的每4个128byte记录。如何从字符串数组中获取4条记录或512字节数据并将其复制到char数据[]变量
感谢您的帮助
答案 0 :(得分:1)
首先,std::string
与字节数组不同。
其次,构建这四个记录块的最简单方法可能是内循环。
for(int index = 0; index < 26000; index += 4)
{
// copy data
for (int j=0; j<4; j++) {
assert(array[index+j].size() == 128);
memcpy((data)+(128*j), array[index+j]+data(), 128);
}
// send data on socket
}
最后,正如其他答案所指出的那样,使用C风格的数组容易出错;最好在以后使用std::string
或其他STL类型,就像实际在套接字上发送数据一样。
答案 1 :(得分:0)
您有26,000个std::string
个对象,每个对象都有自己的内部数据,不保证内部缓冲区从一个对象连续到另一个对象。您的解决方案是修改循环对象,以便在填充data
数组时单独使用每个对象。
答案 2 :(得分:0)
我建议您避免混用C和C ++代码。以下是如何做到的:
#include <numeric>
#include <string>
std::string array[26000];
const int add = 4;
for (int i = 0; i < 26000; i += add)
{
std::string data;
data = std::accumulate(array + i, array + i + add, data);
// send data on socket
}
我甚至在std :: vector上替换了第一个26000个元素数组,并在size()方法调用上替换了常量26000。使用C风格的数组很容易出错。
答案 3 :(得分:0)
你的循环计数变量正在增加4,但你只抓取一条记录。我认为更好的方法是让字符串对象为你处理内存分配,然后从结果字符串中抓取字符并将其发送出来。
for(int i = 0; i < 26000; i += 4)
{
string four_recs = array[i] + array[i+1] + array[i+2] + array[i+3];
// Extract characters
char *byte_data = new char [four_recs.length()];
for (int j = 0; j < four_recs.length()]; j++)
byte_data[j] = four_recs[j];
// Send it out
}