为什么fwrite 与 CFile Write写文件结果不一样?

张亚成 2014-04-30 03:18:07
使用CFile写文件方法写的文件 跟 使用 fwrite 写文件方法写的文件不一样,不知道怎么回事儿,请指点。

fwrite方法

在之前打开文件
m_fp = fopen(szFileName, "wb");
接着写文件
int WriteSampleData(char *pBuf, int nSize)
{
_ASSERT(pBuf);
if(nSize == 0)
return -1;
if(m_fp == NULL)
return -1;
fwrite(pBuf, 1, nSize, m_fp);
m_dwTotalSize += nSize;
m_dwAudioSize += nSize;
return 1;
}


]CFile 方法[

strFileName = _T(".\\Data\\") + strFileName;
if (!dataFile.Open(strFileName.GetBuffer(strFileName.GetLength()), CFile::modeWrite))
{
dataFile.Open(strFileName.GetBuffer(strFileName.GetLength()), CFile::modeWrite | CFile::modeCreate);
}

dataFile.SeekToEnd();

//dataFile.Write(pOutPutBuf,nLen); // 把编码后的数据保存在文件上
dataFile.Write(lpData,nDataLength); // 把没有编码的数据存放在文件上
dataFile.Close();
...全文
487 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
张亚成 2014-05-21
  • 打赏
  • 举报
回复
引用 35 楼 xingxing122 的回复:
数据格式不一样,两个函数的设置不一样
张亚成 2014-05-21
  • 打赏
  • 举报
回复
引用 34 楼 stephen_young 的回复:
lz一直没有说文件里是什么数据,如果数据是来自某一个实时的流,比如说串口的ascii字符,那么倒是有可能是字符集的问题,不过这种可能性太小了,因为用UE很容易验证。我猜,是其它类的实时流,而且是不重复的,比如说视频、音频...别生气,我不是专家,只是很感兴趣你的数据是什么,猜猜而已...
你说得有道理,那个问题已解决,原因是一个代码写错了。谢谢你的指导。这个问题的出现主要是因为我的调试代码的能力太差。
张亚成 2014-05-05
  • 打赏
  • 举报
回复
引用 31 楼 worldy 的回复:
应该是这样,但6的代码和2010可能(只是可能)有些差别 你可以在原来在2010上的工程直接设置为ansi字符集
谢谢您的指点[color=#FF0000][/color]
worldy 2014-05-05
  • 打赏
  • 举报
回复
应该是这样,但6的代码和2010可能(只是可能)有些差别 你可以在原来在2010上的工程直接设置为ansi字符集
张亚成 2014-05-05
  • 打赏
  • 举报
回复
引用 28 楼 worldy 的回复:
[quote=引用 26 楼 zhangyacheng_1 的回复:] [quote=引用 25 楼 worldy 的回复:] [quote=引用 24 楼 zhangyacheng_1 的回复:] [quote=引用 22 楼 worldy 的回复:] lz应该是两种文件操作方式时,编译选择的编码不同,前者使用ansi,后者使用了unicode?
嗯, 一个用VC6 ,一个 用Vs2010 ,都使用的是默认设置 [/quote] 那你将2010下,编码改成ansi(字符集选不设置)看看是否还会不一样?[/quote] 这个可以设置?[/quote] 项目-属性-常规下,字符集[/quote] 这样设置之后,原来VC6上的代码就可以直接复制到2010上,运行情况和错误时候的报错情况跟之前使用VC6.0的结果完全一致。是这个意思吗?
张亚成 2014-05-05
  • 打赏
  • 举报
回复
引用 27 楼 zhao4zhong1 的回复:
[quote=引用 23 楼 zhangyacheng_1 的回复:] [quote=引用 21 楼 zhao4zhong1 的回复:] 只write,不flush和close的write能靠谱吗?
在一段代码中write, 在别的地方close ,从逻辑上讲这样比每次写完一句都close或者flush效率更高[/quote] 在你没有flush和close的时候,在其它进程中企图读取文件内容查看是否write成功? 提醒:请判断fwrite函数的返回值![/quote] 没有这个弄过,因为我的代码中是 先把程序中的数据写到文件上, 一直写, 写好之后 , 再给 文件使用close函数
worldy 2014-05-05
  • 打赏
  • 举报
回复
引用 26 楼 zhangyacheng_1 的回复:
[quote=引用 25 楼 worldy 的回复:] [quote=引用 24 楼 zhangyacheng_1 的回复:] [quote=引用 22 楼 worldy 的回复:] lz应该是两种文件操作方式时,编译选择的编码不同,前者使用ansi,后者使用了unicode?
嗯, 一个用VC6 ,一个 用Vs2010 ,都使用的是默认设置 [/quote] 那你将2010下,编码改成ansi(字符集选不设置)看看是否还会不一样?[/quote] 这个可以设置?[/quote] 项目-属性-常规下,字符集
赵4老师 2014-05-05
  • 打赏
  • 举报
回复
引用 23 楼 zhangyacheng_1 的回复:
[quote=引用 21 楼 zhao4zhong1 的回复:] 只write,不flush和close的write能靠谱吗?
在一段代码中write, 在别的地方close ,从逻辑上讲这样比每次写完一句都close或者flush效率更高[/quote] 在你没有flush和close的时候,在其它进程中企图读取文件内容查看是否write成功? 提醒:请判断fwrite函数的返回值!
张亚成 2014-05-05
  • 打赏
  • 举报
回复
引用 25 楼 worldy 的回复:
[quote=引用 24 楼 zhangyacheng_1 的回复:] [quote=引用 22 楼 worldy 的回复:] lz应该是两种文件操作方式时,编译选择的编码不同,前者使用ansi,后者使用了unicode?
嗯, 一个用VC6 ,一个 用Vs2010 ,都使用的是默认设置 [/quote] 那你将2010下,编码改成ansi(字符集选不设置)看看是否还会不一样?[/quote] 这个可以设置?
worldy 2014-05-05
  • 打赏
  • 举报
回复
引用 24 楼 zhangyacheng_1 的回复:
[quote=引用 22 楼 worldy 的回复:] lz应该是两种文件操作方式时,编译选择的编码不同,前者使用ansi,后者使用了unicode?
嗯, 一个用VC6 ,一个 用Vs2010 ,都使用的是默认设置 [/quote] 那你将2010下,编码改成ansi(字符集选不设置)看看是否还会不一样?
张亚成 2014-05-05
  • 打赏
  • 举报
回复
引用 22 楼 worldy 的回复:
lz应该是两种文件操作方式时,编译选择的编码不同,前者使用ansi,后者使用了unicode?
嗯, 一个用VC6 ,一个 用Vs2010 ,都使用的是默认设置
张亚成 2014-05-05
  • 打赏
  • 举报
回复
引用 21 楼 zhao4zhong1 的回复:
只write,不flush和close的write能靠谱吗?
在一段代码中write, 在别的地方close ,从逻辑上讲这样比每次写完一句都close或者flush效率更高
xingxing122 2014-05-05
  • 打赏
  • 举报
回复
数据格式不一样,两个函数的设置不一样
奔跑的北极熊 2014-05-05
  • 打赏
  • 举报
回复
lz一直没有说文件里是什么数据,如果数据是来自某一个实时的流,比如说串口的ascii字符,那么倒是有可能是字符集的问题,不过这种可能性太小了,因为用UE很容易验证。我猜,是其它类的实时流,而且是不重复的,比如说视频、音频...别生气,我不是专家,只是很感兴趣你的数据是什么,猜猜而已...
赵4老师 2014-05-05
  • 打赏
  • 举报
回复
引用 29 楼 zhangyacheng_1 的回复:
[quote=引用 27 楼 zhao4zhong1 的回复:] [quote=引用 23 楼 zhangyacheng_1 的回复:] [quote=引用 21 楼 zhao4zhong1 的回复:] 只write,不flush和close的write能靠谱吗?
在一段代码中write, 在别的地方close ,从逻辑上讲这样比每次写完一句都close或者flush效率更高[/quote] 在你没有flush和close的时候,在其它进程中企图读取文件内容查看是否write成功? 提醒:请判断fwrite函数的返回值![/quote] 没有这个弄过,因为我的代码中是 先把程序中的数据写到文件上, 一直写, 写好之后 , 再给 文件使用close函数 [/quote] 我只是提醒你千万别在flush或close还没调用之前去用其它软件打开正写的文件去验证刚write的数据是否成功写到磁盘文件中而已。
schlafenhamster 2014-05-04
  • 打赏
  • 举报
回复
用 UE 看 Hex 。 把 不同处 拷贝 上来, 没 数据 , 不知道 是 什么。
张亚成 2014-05-04
  • 打赏
  • 举报
回复
引用 14 楼 k_badboy 的回复:
完全无视我在9楼的回答?那我再说一遍,你用fopen时,我没看到有fseek操作,即是从文件头开始写,相当于覆盖,用CFile时,有一个SeekToEnd操作,这是把操作指针移动到文件尾,相当于追加内容。结果当然不一样了。 另外,这句我看不出来你写GetBuffer是为了什么需要, dataFile.Open(strFileName.GetBuffer(strFileName.GetLength()),CFile::modeXXX); 直接 dataFile.Open(strFileName,CFile::modeXXX); 就行了
fopen操作完成之后文件指针就指的是文件当前写到的位置, 这个调用是在把文件往文件末尾写的时候调用的,所以以后再次调用同样的函数的话,写文件得到的情况还是把文件写到文件的末尾,应该是没有问题的。 CFile的seekToEnd操作也是把文件指针移动到文件的末尾。 我没有意识到这个操作与上面的操作有什么不一样,请指点 ? 至于你说的 直接 dataFile.Open(strFileName,CFile::modeXXX); 就行了 这个样的操作在VS2010上使用的时候报错,错误原因是参数格式不对。
张亚成 2014-05-04
  • 打赏
  • 举报
回复
引用 13 楼 stephen_young 的回复:
[quote=引用 12 楼 fdsdfdsf 的回复:] fwrite是CRT函数,CFile直接封装的WriteFile API,对控制字符的处理有些许差别。
所以还是先要明确到底哪里不一样。[/quote] 你到底知道还是不知道, 感觉你好像是在装专家似的。
worldy 2014-05-04
  • 打赏
  • 举报
回复
lz应该是两种文件操作方式时,编译选择的编码不同,前者使用ansi,后者使用了unicode?
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
只write,不flush和close的write能靠谱吗?
加载更多回复(17)

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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