c语言fwrite写文件失败
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言fwrite写文件失败相关的知识,希望对你有一定的参考价值。
先说一下我的需求:有2个bin文件,需要把ok.bin的0x210000开始长度为0x10000的值copy到bad.bin中的同样的位置去。在往bad.bin中写的过程中失败,没有写成功,我试了一下,如果把rb+改成wb+是可以写的,但是会把bad.bin清空。下面是我写的程序,还没有加循环,只是写0x210000位置的一个byte,但是没成功,应该是文件指针有问题。用的是VS2008。新手求帮助!谢谢!
#include <stdio.h>
int main()
FILE* pokfile,*pbadfile;
char ch,*OKfilename = "d:\\OK.bin";
char *Badfilename = "d:\\bad.bin";
// double n = 0x210000;
pokfile = fopen(OKfilename, "rb+");
pbadfile = fopen(Badfilename,"rb+");
if(pokfile == NULL || pbadfile == NULL)
printf("ERROR: Open file not success. \n ");
fseek(pokfile, 0x210000, SEEK_CUR);
fread(&ch,1,1,pokfile);
//printf("ch = %x \n",ch); //comfirm ch is the right data;
fseek(pbadfile,0x210000,SEEK_CUR);
fwrite(&ch, 1, 1, pbadfile);
fclose(pbadfile);
fclose(pokfile);
return 0;
--------------------------------------追问-------------------------------------------------------
我不知道我的VS2008出了什么问题,在调试的时候发现pokfile这个指针是对的,但是pbadfile这个指针是空的,但是程序还能运行结束,结果也是对的,很怪。
另外,这循环该怎么写呢?我要循环0x10000次
---------------------------------------追问----------------------------------------------------------
我自己写好了,验证ok,分给那位码字多的了,辛苦了
fp=fopen("绝对路径","w");
if(fp==NULL)
perror("fopen");
fwrite(,,,fp);
如果出错,请先看报错时fopen出现的信息,是不是不存在文件或段的意思 参考技术B fwrite 操作后会把文件指针位置 向后 移动size*count字节。接着再fwrite就从这个当前位置起写。
while循环里,例如读1个结构,写一个结构,一直到读到 文件结束符 EOF为止。
这种写法有没有必要看情况决定。例如,一个结构就是一个学生的成绩单,但一开始并不知道文件里一共有多少学生,那么用这种循环读的方法,就可以计数,可以动态分配单元。
计数器初始化为0。成功读入1个结构,就把计数器加1。直到fread()失败--返回EOF。
int c=fread(xxx, 10,10, fp), c有没有可能<100但是>0。 有可能。所以可以 通过 c 是否等于 100
来判断 是否成功,是否合理, 并采取措施。
例如,有一个题目,是读入1个文件,平均地拆成3个文件输出,再读入这3个文件,合成1个文件。
因为文件的字节总数,未必是3 的倍数,所以 想读的个数和真正读到的个数就有可能不同。要使拆开的文件再合起来,与原文件一模一样,就要用到c。 参考技术C 描述 清楚一些,文件是否存在 文件打开是否正确 是否有写权限 参考技术D strerr和errorno结合,可以查出原因 第5个回答 推荐于2017-12-16 这个程序原则意义上是没有问题的,可能存在的错误有以下几点:
一、欲读取的文件没有那么多数据,也就是说你想要读取的文件没有大到0x210000有数据,所以导致不能成功。
二、采用rb+的方式写入文件(以更新方式打开(读写))。这个也是没有问题的。但是要求以此种方式打开的文件必须存在,也就是说你必须在运行这个程序之前把这个文件建好。
三、采用上述的方式写入到0x210000位置时,如果文件的是空的,那么程序会在文件的0x210000地址之前填充0.
所有可能的问题就上述这些,我自己运行过这个程序,在解决好上面的问题之后,程序没有出错,因此,可以尝试把这个地址调小一点。本回答被提问者采纳
fread 和 fwrite 有没有失败?如何处理?
【中文标题】fread 和 fwrite 有没有失败?如何处理?【英文标题】:do fread and fwrite have failure? how to handle this? 【发布时间】:2012-03-12 11:28:40 【问题描述】:当我使用 fread(C 语言)从文件中读取时,fread 的返回值有时会是 0。
按照手册的建议:
fread() 和 fwrite() 返回成功读取的项目数或 写的
我必须写这样的代码吗?
int bytes_read;
while((bytes_read = fread(buffer, sizeof(int), 1, fp)) == 0)
我们是否总是需要检查 fread 或 fwrite 是否成功?
【问题讨论】:
【参考方案1】:不,如果fread
或fwrite
返回的记录数少于预期的读取或写入记录数,则执行这样的重试循环是没有意义的。也就是说,stdio 不像低级的read
和write
操作会导致“短”读或写。
如果fread
返回的记录数少于请求的记录数,则说明您遇到了 EOF 或严重的读取错误。您可以通过检查feof()
和ferror()
来区分它们。
同样,如果fwrite
返回的记录数少于请求的记录数,您要么磁盘空间不足,要么遇到严重的写入错误。
无论如何,由于 stdio 的缓冲使得基本上无法知道成功写入了多少,所以如果遇到写入错误,通常需要考虑文件丢失并中止整个操作。
【讨论】:
【参考方案2】:http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html
成功完成后,fread() 将返回成功读取的元素数,仅当遇到读取错误或文件结尾时,该数小于 nitems。如果 size 或 nitems 为 0,fread() 将返回 0,并且数组的内容和流的状态保持不变。否则,如果发生读错误,则应设置流的错误指示符,并设置errno来指示错误。
http://pubs.opengroup.org/onlinepubs/007904875/functions/fwrite.html
fwrite() 函数应返回成功写入的元素数,如果遇到写入错误,可能小于 nitems。如果 size 或 nitems 为 0,fwrite() 将返回 0 并且流的状态保持不变。否则,如果发生写入错误,则应设置流的错误指示符,并设置errno以指示错误
必须使用 ferror() 或 feof() 函数来区分错误条件和文件结束条件。
【讨论】:
【参考方案3】:如果 fread 失败,它通常会继续失败。通常是因为它到达了文件的末尾,但也可能是其他原因。如果失败,您通常不会再试一次。
【讨论】:
【参考方案4】:是的。
返回值应始终为 count。
如果不是 - 您应该使用 ferror()
或 feof()
来确定您是否已到达文件末尾和/或遇到错误。
忽略错误和/或意外情况会导致不可靠的软件对毫无戒心的用户造成影响。
http://www.cplusplus.com/reference/clibrary/cstdio/fread/
http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html
【讨论】:
不,整个操作成功时返回值是count
,而不是size*count
。
@R.. - 呃...我不认为这是正确的。你确定吗?您有不同意我发布的文档的文档吗?
@R.. - 我很确定如果您请求“5”个大小为“10”的项目,那么响应应该是“50”而不是“5”。
R.是对的。 fread()
和 fwrite()
返回成功读取或写入的项目数,而不是字节数。
如果 cplusplus.com 声称这是字节数,我不会感到惊讶......该网站充满了错误信息,永远不应被引用为权威。以上是关于c语言fwrite写文件失败的主要内容,如果未能解决你的问题,请参考以下文章
C 语言文件操作 ( 按照内存块的方式读写文件 | fread 函数 | fwrite 函数 )