windows 下fwrite问题

lzlilj 2011-07-28 10:48:28
大家好,我现在把linux的程序移植到windows,可是使用fwrite写二进制文件的时候却在文件尾出现了乱码,比如我定义了一个三维数组
FILE *fp;
fp=fopen("aaa.dat","wb+");
unsigned short sv[4][8000][24]
for(i=;i<4;i++)
{
fwrite(sv+i*8000*24,sizeof(unsigned short)*8000*24,fp);
}

这样写出来只有i=0;时输出的二维数据是正确的,其他的几维都是乱码,有谁知道是怎么回事,我在linux下就是正确的,字节序我也是转换了,我实在是找不出问题了,请大家帮帮我吧
...全文
442 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
gz_qmc 2011-07-28
  • 打赏
  • 举报
回复
另外想不通的地方
一,这么大的开销,为嘛不动态分配?有保证吗?
二,既然有分四个通道的要求,为啥不分开,搞这么大?
gz_qmc 2011-07-28
  • 打赏
  • 举报
回复
想骂人,这怎么是移植的?移植的还写错,还不只错一处
fwrite((char*)&sv[i*8000*24],sizeof((unsigned short)*8000*24*4,1,fp);
这样不好吗?
(char*)&sv[i*8000*24] 就比不上sv+i*8000*24
pengzhixi 2011-07-28
  • 打赏
  • 举报
回复
一.你开这么大的数组注意栈空间大小问题。
二.数组需要初始化。
辰岡墨竹 2011-07-28
  • 打赏
  • 举报
回复
fwrite(sv,sizeof(unsigned short),8000*24*4,fp);
也行
辰岡墨竹 2011-07-28
  • 打赏
  • 举报
回复

FILE *fp;
fp=fopen("aaa.dat","wb+");
unsigned short sv[4][8000][24]
fwrite(sv,sizeof(unsigned short)*8000*24,4,fp);
fclose(fp); // 打开的文件一定要关闭,才能把C文件缓存里的东西写进去。
辰岡墨竹 2011-07-28
  • 打赏
  • 举报
回复

FILE *fp;
fp=fopen("aaa.dat","wb+");
unsigned short sv[4][8000][24]
fwrite(sv,sizeof(unsigned short)*8000*24,4,fp);
fclose(fp);
lzlilj 2011-07-28
  • 打赏
  • 举报
回复
我在网上查了查,有的人说是因为我写的数据量小没有把IO缓冲区填满就没有写到磁盘上,就会出错,我自己然后又写了一个二进制文件,unsigned short sv[384000],没有循环只写一次,后面依然乱码,到380156个字节的时候就是乱码了

应该怎么解决啊
bdmh 2011-07-28
  • 打赏
  • 举报
回复
第一个参数sv+i*8000*24,位置已经改变了,不是初始位置,所以只有i=0时,才是起始位置,所以是对的
赵4老师 2011-07-28
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
lzlilj 2011-07-28
  • 打赏
  • 举报
回复
不可以,这是我的一个需求,我需要写4个通道的东西
ryfdizuo 2011-07-28
  • 打赏
  • 举报
回复
unsigned short sv[4*8000*24];
fwrite(sv,sizeof(unsigned short)*8000*24*4,fp); //一次性写好了。。。
lzlilj 2011-07-28
  • 打赏
  • 举报
回复
大侠,不要发火,我写错了个东西,unsigned short sv[4*8000*24],数组是这样定义的,呵呵,后面确实是乱码
gz_qmc 2011-07-28
  • 打赏
  • 举报
回复
我已经懒得解释了
给你看看这个,愿意改就改,不愿意就拉倒
FILE *fp;
fp=fopen("aaa.dat","wb+");
unsigned short sv[4][8000][24]
for(i=;i<4;i++)
{
fwrite(sv[i],sizeof(unsigned short)*8000*24,1,fp);
}

或者
FILE *fp;
fp=fopen("aaa.dat","wb+");
unsigned short sv[4][8000][24]
for(i=;i<4;i++)
{
fwrite(sv+i,sizeof(unsigned short)*8000*24,1,fp);
}
品茶 2011-07-28
  • 打赏
  • 举报
回复
fwrite到了文件尾就跳出了 你要自己加'\0'
一叶之舟 2011-07-28
  • 打赏
  • 举报
回复
建议如下
fwrite(sv+i*8000*24,sizeof(unsigned short)*8000*241,1,fp);

注意fwrite的第二个和第三个参数。这两个数的乘积是你一次写入的数据。
fwrite(sv+i*8000*24,sizeof(unsigned short)*8000*24,fp);
你的代码是上一行,第一个sizeof(unsigned short)*8000*24肯定写进去了,至于后面的只有天知道是什么东西了。
ri_aje 2011-07-28
  • 打赏
  • 举报
回复
主楼程序是典型的数组越界访问问题,没崩掉就已经很幸运了。导致问题的原因就是这一行

fwrite(sv+i*8000*24,sizeof(unsigned short)*8000*24,fp);

其中第一个参数导致严重的数组出界。问题的关键在于 sv 的类型,如果 sv 是 unsigned short *,那么 sv+i*8000*24 能够产生正确的偏移。可是 sv 的具体类型是 unsigned short (*) [8000][24],因此 sv 每增加一个单位就会跨越 8000*24*sizeof(unsigned short) 个 byte。所以 sv+i*8000*24 与 sv 的距离为 i*8000*24 * 8000*24*sizeof(unsigned short) 个 byte,越界行为显而易见。正确的写法应该这样。

fwrite(sv+i,sizeof sv[i],fp);

需要说明的是这种写法只对 sv 像主楼程序中那样定义的时候才有效,如果楼主将其转换为 unsigned short* (无论通过何种方式),那么主楼的写法就正确了。
楼主说此程序在 linux 下的时候行为正确,唯一可能的解释就是 linux 下楼主用的编译器将 sv 隐式转换为 unsigned short* 了,然而这种转换是明确不符合标准的,因此还是在 windows 下面的结果是正确的,虽然并没有达到楼主的意图。不知道 linux 下楼主用的什么编译器,具体哪个版本?
lzlilj 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gz_qmc 的回复:]

想骂人,这怎么是移植的?移植的还写错,还不只错一处
fwrite((char*)&sv[i*8000*24],sizeof((unsigned short)*8000*24*4,1,fp);
这样不好吗?
(char*)&sv[i*8000*24] 就比不上sv+i*8000*24
[/Quote]

这位大哥不要激动,呵呵,我现在的程序是可以跑的,我发帖的时候写错了一些东西,望大哥见谅,最主要的是我同样的方法写的文件,有一个4*8192*8160这么大的数组写完后是没有错的
lzlilj 2011-07-28
  • 打赏
  • 举报
回复
我们就不用讨论有几百个CPU和几个T的内存这个问题了
我们没有在WINDOWS上做过这些,希望还是能解决这个问题,非常感谢大家
hzy694358 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lzlilj 的回复:]

呵呵,因为我们的数据量比较大,原始的数据大概是500M以上的二进制数据,我要把这些数据处理后输出到不同文件,在linux上我们开的内存都是无休止的,有几百个CPU和几个T的内存,所以根本看不出来,这个数组我就是动态分配的,使用NEW分配的,这上面我忘了写出来,而且也MEMSET了,写完后文件也关闭了,也使用fflush了,可都是不行啊
[/Quote]
有几百个CPU和几个T的内存
够牛叉
lzlilj 2011-07-28
  • 打赏
  • 举报
回复
呵呵,因为我们的数据量比较大,原始的数据大概是500M以上的二进制数据,我要把这些数据处理后输出到不同文件,在linux上我们开的内存都是无休止的,有几百个CPU和几个T的内存,所以根本看不出来,这个数组我就是动态分配的,使用NEW分配的,这上面我忘了写出来,而且也MEMSET了,写完后文件也关闭了,也使用fflush了,可都是不行啊

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧