【问题标题】:fread and fwrite parameters in CC中的fread和fwrite参数
【发布时间】:2016-12-29 09:41:01
【问题描述】:

我正在尝试使 matlab 程序适应 C,我的问题出在 fwritefread 函数中。在 matlab 上我有:

fid = fopen ('sweep_100_3400.pcm','rb');
s = fread (fid, 'int16');

我的疑问是,在 C 中,freadfwrite 函数中还有两个参数。

fread(void*, size_t, size_t, FILE*);
fwrite(const void*, size_t, size_t, FILE*);

在我的 C 代码中:

arq = fopen("C:\\Users\\iago_\\Desktop\\MediaMovel\\sweep_100_3400.pcm", "rb");
fread(x, sizeof(double), itera, arq);
fclose(arq);

x 是保存我的文件数据的向量。
sizeof(double) 是数据的长度(我已经声明了所有double
arq 是指针到文件。

第三个参数是size_t,为了适配我的matlab程序,在这个参数中我应该使用媒体长度还是向量大小?

(我正在编码移动平均值,媒体长度由用户通知,向量大小是我输入文件的长度)。

对于fwrite函数,我对参数有同样的疑问。

arq=fopen("C:\\Users\\iago_\\Desktop\\MediaMovel\\saida_medial_movel_c.pcm", "wb");
fwrite(saida, sizeof(double), itera, arq);
fclose(arq); 

【问题讨论】:

  • freadsizecount 参数相乘后,不得大于接收缓冲区大小。阅读手册页将对您有所帮助。此外,fread 的返回值很重要,因为请求的数据量可能不可用。
  • 贴出saida的定义以及itera的值是如何推导出来的,以便更好地提出问题。
  • 您的目标尚不清楚,但如果您尝试将您从带有fread 的文件中读取的数据写入带有fwrite 的另一个文件,那么fwritecount 参数必须是fread 的返回值 - 被读取的大小为 size 的元素的数量。

标签: c matlab moving-average


【解决方案1】:

fread() 参数是

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

其中 nmemb 是读取的大小函数的倍数。所以第二个参数应该是你的向量的大小,第三个应该是你想从文件指针中读取的向量的数量。关于 matlab fread 调用也存在混淆。 matlab fread 调用中的第二个参数是 int16,它是 2 个字节,但是在 c fread 调用中,您将第二个参数传递为 sizeof(double),它是 8 个字节。

【讨论】:

  • sizeof(double) 不保证为 8 个字节。可以是 1、2 等,具体取决于 CHAR_BITdouble 所需的内存。与int16 类似:可以是12
  • 我解决了这个问题,在我的 x 向量中使用短类型而不是双精度,这样就可以了。
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多