C ++ Char指向char数组的指针

时间:2012-03-01 06:28:16

标签: c++ memcpy arrays

我读过的所有答案都没有,所以我再问一次。

我正在尝试将char指针指向的 string 数据复制到char数组中。

我有一个从ifstream读取到char数组的函数

char* FileReader::getNextBytes(int numberOfBytes) {
    char *buf = new char[numberOfBytes];

    file.read(buf, numberOfBytes);

    return buf;
}

然后我有一个结构:

struct Packet {
    char data[MAX_DATA_SIZE]; // can hold file name or data
} packet;

我想将从getNextBytes(MAX_DATA_SIZE)返回的内容复制到packet.data;

编辑:让我告诉你我所得到的所有答案(memcpy,strcpy,传递参数)。我认为错误来自其他地方。我正在读一个二进制文件(它是一个png)。我将循环而fstream是好的()并从fstream读取到buf(可能是数据数组)。我想看看我读过的内容的长度:

cout << strlen(packet.data) << endl;

每次都会返回不同的大小: 8 529 60 46 358 66 156 之后,显然没有剩余的字节可供读取,尽管文件长度为13K +字节。

4 个答案:

答案 0 :(得分:4)

这可以使用标准库函数memcpy来完成,该函数在/:

中声明
strcpy(packet.data, buf);

这需要file.read返回以'\ 0'结尾的正确char系列。您可能还希望确保numberOfBytes足以容纳整个字符串。否则你可能会出现分段错误。

答案 1 :(得分:3)

//if buf not properly null terminated added a null char at the end
buf[numberofbytes] = "\0"

//copy the string from buf to struc
strcpy(packet.data, buf);

//or

strncpy(packet.data, buf);

答案 2 :(得分:2)

修改:
是否将其作为字符串处理是一个非常重要的区别。在你的问题中,你把它称为“字符串”,这让我们感到困惑。


没有任何图书馆协助:

char result = reader.getNextBytes(MAX_DATA_SIZE);
for (int i = 0; i < MAX_DATA_SIZE; ++MAX_DATA_SIZE) {
  packet.data[i] = result[i];
}
delete [] result;

使用#include <cstring>

memcpy(packet.data, result, MAX_DATA_SIZE);

或者为了额外的功劳,请重写getNextBytes,以便它有一个输出参数:

char* FileReader::getNextBytes(int numberOfBytes, char* buf) {
  file.read(buf, numberOfBytes);

  return buf;
}

然后就是:

reader.getNextBytes(MAX_DATA_SIZE, packet.data);

编辑2:
获取文件的长度:

file.seekg (0, ios::end);
int length = file.tellg();
file.seekg (0, ios::beg);

随着手头......

char* buffer = new char[length];
file.read(buffer, length);

现在您将整个文件放在buffer

答案 3 :(得分:0)

strlen不是确定二进制数据量的有效方法。 strlen只是读取,直到它找到'\ 0',仅此而已。如果要读取一块二进制数据,只需使用std :: vector,将其大小调整为从文件中读取的字节数,然后将其作为值返回。问题解决了。