【问题标题】:Writing to a file in c, garbage value gets populated用c写入文件,垃圾值被填充
【发布时间】:2017-12-08 20:35:10
【问题描述】:

该代码应该将它在 fileReceived 中获得的任何数据附加到 a.txt 文件中,但它会填充随机值。(当然也不是那么随机,但绝对不是正确的值)。我错过了什么吗?

File *fp;
fp = fopen("a.txt",+a);
while(1)
{
    fileReceived =...// getting char array of 1024 size
    fwrite(fileReceived,1,sizeof(fileReceived),fp);

    if(padding!=0)
    {
      fclose(fp);
      break;
    }
}

【问题讨论】:

  • 谁在设置填充?你在哪里定义 fileReceived ?
  • sizeof(fileReceived) 可能不是 1024 而是指针的大小。
  • 你已经隐藏了重要的部分:fileReceived =...// 获取 1024 大小的 char 数组
  • 检查我的答案。 sizeof() 不适用于动态分配的数组。

标签: c io fwrite


【解决方案1】:

即使您没有显示正确的部分,也要猜测(但不能是其他情况):

fileReceived =...// getting char array of 1024 size
fwrite(fileReceived,1,sizeof(fileReceived),fp);

fileReceived 必须是数据指针,所以 sizeof(fileReceived) 不是 1024,而是 4 或 8,具体取决于您的架构(因为不可能将一个数组分配给另一个数组)

您在循环中写入的数据太少,您的文件获取的是第一个值,但不是最后一个值。既然你知道大小,就这样修复它:

int size = 1024;
...
fwrite(fileReceived,1,size,fp);

如果数据大小不同,您必须从提供指向您的指针的任何函数中获取大小信息,否则您将获得未定义的行为

【讨论】:

  • 谢谢。你对这两种情况都是正确的。我之前只使用 1024。
  • 我检查了数据,最后一个数据包的大小不是 1024。抱歉,我无法正确发布所有详细信息,它是为了分配,因此我无法发布整个代码。跨度>
  • 没问题。最后一个数据包必须是您更改fwrite 大小的特殊情况,仅此而已。但是您必须知道大小,无论是全尺寸(因此您可以减去 1024 直到尺寸小于该尺寸)或每次迭代。
  • 是的,我只是现在才尝试这样做。感谢您的帮助让。
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
相关资源
最近更新 更多