【问题标题】:C++ Char pointer to char array指向 char 数组的 C++ Char 指针
【发布时间】:2012-03-19 16:14:25
【问题描述】:

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

我正在尝试将 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 为 good() 时循环并从 fstream 读取到 buf(可能是数据数组)。我想看看我读过的内容的长度:

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

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

【问题讨论】:

  • 或者您可以将一个指向 packet.data 的指针传递给 getNextBytes... 然后将数据直接放入其中,避免创建无关的字符数组和复制。跨度>
  • 什么不起作用?你试过strcpystrncpy吗?您的buf 是否正确终止了 NULL?
  • 我尝试了这两个,是的,buf 正确地以 NULL 终止。 Buf 可能实际上是从 fstream 文件中读取的二进制数据
  • 如果您因缺乏回复或正确解决方案而不得不重新发布,请尝试针对该问题授予赏金

标签: c++ memcpy arrays


【解决方案1】:

这可以使用标准库函数 memcpy 来完成,它在 / 中声明:

strcpy(packet.data, buf);

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

【讨论】:

    【解决方案2】:
    //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);
    

    【讨论】:

      【解决方案3】:

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


      没有任何图书馆协助:

      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 &lt;cstring&gt;

      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 中拥有整个文件。

      【讨论】:

      • 最后一切都解决了。但是在这里你误解了我正在做的事情的目的。如果可以的话,我当然会在一个数据包中发送整个文件。但我们想将其分解并作为帧发送,这就是为什么我要传递要读取的字节数(= 到 MAX_DATA_SIZE)。不过谢谢。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2021-01-26
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 2016-01-27
        相关资源
        最近更新 更多