我读过的所有答案都没有,所以我再问一次。
我正在尝试将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 +字节。
答案 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,将其大小调整为从文件中读取的字节数,然后将其作为值返回。问题解决了。