C++字符指针转换为字符数组

4

我读过的所有答案都不可行,所以我再次提问。

我正试图将由char指针指向的字符串数据复制到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字节,但似乎没有剩余字节可读取。

3
或者你可以将packet.data的指针传递给getNextBytes函数...那么你就可以直接把数据放入其中,避免创建多余的字符数组和拷贝操作。 - Justin Peel
1
什么没有起作用?你尝试过 strcpystrncpy 吗?你的 buf 是否正确地以 NULL 结尾? - Naveen
我尝试了这两种方法,是的,buf已经正确地以NULL结尾。Buf实际上可能是从fstream文件中读取的二进制数据。 - Sotirios Delimanolis
1
如果您因缺乏回复或正确的解决方案而不得不重新发布问题,请尝试在该问题上设置悬赏奖金。 - Rohit Vipin Mathews
4个回答

4

可以使用标准库函数memcpy来完成此操作,该函数在/中声明:

strcpy(packet.data, buf);

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

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
编辑:
将其作为字符串处理与否是非常重要的区别。在你的问题中,你提到它是一个“字符串”,这让我们都感到困惑。

没有任何库的帮助:

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);

通过这个,你就能够方便地使用IT技术了。
char* buffer = new char[length];
file.read(buffer, length);

现在你已经将整个文件存储在buffer中。

最终一切都解决了。但是你误解了我所做的目的。如果可以的话,我当然会将整个文件作为一个数据包发送。但我们想要将其分解并作为帧发送,这就是为什么我传递要读取的字节数(等于MAX_DATA_SIZE)的原因。不过还是谢谢。 - Sotirios Delimanolis

0

strlen不是一种有效的确定二进制数据量的方法。strlen只会读取到'\0'为止,没有更多的内容了。如果你想读取一块二进制数据,只需使用std::vector,将其调整大小为从文件中读取的字节数,并将其作为值返回即可。问题解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接