写入二进制文件时的开销数据

时间:2015-07-22 07:27:29

标签: c

我想写一个包含16位整数的数组作为文件的原始二进制文件,并尝试使用以下示例:

PrintWriter print = response.getWriter();

print.println("");

但是,输出包含的不仅仅是零。

#  define __int8_t_defined
__intN_t (8, __QI__);
__intN_t (16, __HI__);
__intN_t (32, __SI__);
__intN_t (64, __DI__);

int main(int argc, char *argv[])
{
    FILE * rawf;
    rawf = fopen("./rawPcm","wb");
    int16_t buff[] = {0,0,0};
    fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);
    fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);  
    fclose(rawf);
}

它为每$ hexdump -v rawPcm 0000000 0000 0000 0000 85fd 0804 0001 0000 0000 0000010 0000 85fd 0804 0001 0000018 0000 0000 0000 85fd 0804 0001,而我希望只获得fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);

附加数据代表什么0000 0000 0000以及如何防止它发生?

2 个答案:

答案 0 :(得分:19)

  

其他数据代表85fd 0804 0001

可能是一些随机垃圾数据。

  

如何防止它发生?

fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);应写成:

fwrite(buff,sizeof(int16_t), sizeof(buff) / sizeof(buff[0]),rawf);
/*               ^                          ^^^^^^^^^^^^^^^      */
/*       size of each object      Count of objects               */
/*              (2)                  (3)                         */

/* or */
fwrite(buff, sizeof buf[0], sizeof buff / sizeof buff[0], rawf);

sizeof buff / sizeof buff[0]获取array length in number of objects (or members),而sizeof buff获取数组的大小(以字节为单位)。

因此,您正在阅读buff并将其写入文件并调用undefined behaviour。在您的情况下,您看到随机垃圾数据被写入输出文件。

在您的情况下,sizeof中每个元素的buff为2个字节,buff数组有3个成员,导致总大小为6个字节。当你写fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);时,每个2字节的6个对象被写入文件,这不是你想要做的事情。

现在,您正在编写6个类型(大小)int16_t的数据,从buff[0]开始,即buff[0..5]到输出。 <{1}}是预期的buff[0..2]0是垃圾。

答案 1 :(得分:9)

-(NSString *)dateToFormatedDate:(NSString *)dateStr { NSString *finalDate = @"2014-10-15"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; NSDate *date = [dateFormatter dateFromString:dateStr]; [dateFormatter setDateFormat:@"EE, d MMM, YYYY"]; return [dateFormatter stringFromDate:date]; } 的第三个参数是第二个参数指定的大小元素的 number 。它不是您当前正在执行的总大小(以字节为单位)。

所以你超越了你的缓冲区。