【问题标题】:Reading data from a file; first packet is gibberish从文件中读取数据;第一个数据包是乱码
【发布时间】:2014-03-09 01:51:31
【问题描述】:

我试图一次从文件中读取 1244 个字节。本质上,这个想法是将价值 100KB 的数据分割成数据包。所以我采用的方法是将所有数据分配给一个数组,然后创建一个指针数组,其中包含每个数据包的起始位置。指针数组包含值 [0、1244、2488 等]。

它工作得很好,除了我的第一个任务是胡言乱语。 k[0] 和 o[0] 都产生了垃圾,而其余 79 个值似乎没问题。任何人都可以提供帮助吗?

我意识到 fread 命令的第一个参数应该是一个指针,但这也有效。此外,我需要指向每个数据包开始的指针,因为我正在执行其他函数调用(从代码中省略),这些函数调用使用适当的标头正确格式化数据包。

自从我用 c/c++ 编码以来已经有一段时间了,所以您可以提供任何优化,将不胜感激。

int main(int argc, const char * argv[])
{
    FILE *data;
    int size; int i;
    int paySize = 1244;
    //int hdrSize = 256;

    data = fopen("text2.dat","r"); 

    //get data size
    fseek(data, 0, SEEK_END);
    size = ftell(data);
    rewind (data);

    char k[size]; //initializing memory location for all the data to be read in.

    fread(k, 1, size, data); //reading in data

    int temp = ceil(size/paySize);

    char * o[temp]; //array of pointers to beginning of each packet.

    int q = 0;

    for (i = 0; i < size; i = i+paySize)
    {
        o[q] = &k[i];
        q++;
    }

    cout << o[0] << endl; //this outputs gibberish! 

【问题讨论】:

  • 因为是k[i]的地址?你想要的可能是 *o[0]
  • 您对cout &lt;&lt; o[0] &lt;&lt; endl; 行的期望是什么?您希望它打印文件中的第一个字符吗?还是整个第一个数据包?
  • 我希望它打印文件的前 1244 个字节。当我将索引值更改为 1 或其他任何值时,它会打印从输入文件中提取的全部 1244 字节信息。
  • 我要求确认; k[0] 也不打印文件上的第一个字符显然是什么?
  • 是的.. 抱歉,这是我的错误.... k 或 o 的索引不会有 1244 字节。我必须在 for 循环中打印以获取所有 1244 个字节。

标签: c++ c arrays variable-assignment


【解决方案1】:
cout << o[0] << endl;

打印该指针指向的地址。要在此地址打印值,请使用:

cout << *o[0] << endl;

这里:

char k[size];
char * o[temp];

o[q] = &k[i];

您将指向字符的指针分配给o[],取消引用此类指针会导致单个char

【讨论】:

  • 是的..我明白你的意思。 o 只是我的数据包开始位置的指针数组。好的..谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2018-08-21
相关资源
最近更新 更多