免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5237 | 回复: 8
打印 上一主题 下一主题

fseek 与fwrite一起使用的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-21 14:57 |只看该作者 |倒序浏览
ques:
1.我不明白为什么打开line16程序就正常了 ,为什么每次都要做fseek?
2.应该是 fseek 到了 10 再读文件, 位置为20 写入"apple", 为什么运行结果是这样,我并没有将buffer写入文件
为何会出现在文件?

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         FILE * fp = fopen("a.txt","r+b");
  5.         char buffer[100] ="1234567890";
  6.        
  7.         fseek(fp, 10,  SEEK_CUR);
  8.        
  9.         fread( buffer,1, 10,fp);
  10.         printf("buffer = [%s]\n", buffer);
  11.        
  12.         /*fread 以后用ftell 看 位置已经到20*/
  13.        
  14. #line 16       
  15.         /*fseek(fp, 10,  SEEK_CUR);*/   
  16.         fprintf(fp,"%s", apple);
  17.         fclose(fp);
  18.        
  19. }

复制代码

// a.txt
1234567890abcdefghijklmnopqrstuvwxyz

执行程序 a.out
// a.txt
1234567890abcdefghijklmnopqrstuvwxyz
abcdefghijapple

[ 本帖最后由 stuff990 于 2006-10-21 16:15 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-10-21 15:07 |只看该作者
原帖由 stuff990 于 2006-10-21 14:57 发表
ques:
1.我不明白为什么打开line16程序就正常了 ,为什么每次都要做fseek?
2.应该是 fseek 到了 10 再读文件, 位置为20 写入"apple", 为什么运行结果是这样,我并没有将buffer写入文件
为何会出现 ...


不明白你要做什么?
不过你的程序与你的结果是正常的。
fseek 到10,然后读10,再输出apple。
也就是读出来的buffer+apple。

论坛徽章:
0
3 [报告]
发表于 2006-10-21 16:19 |只看该作者

回复 2楼 lonelyair 的帖子

我只想写入  fprintf(fp,"%s", apple);
并没有将buffer写入文件, 怎么会这样abcdefghijapple?
我想和文件的缓冲是有关系的, 并且fwrite  和 fread 可以维系着不同的位置指针

论坛徽章:
0
4 [报告]
发表于 2006-10-21 16:26 |只看该作者
原帖由 stuff990 于 2006-10-21 16:19 发表
我只想写入  fprintf(fp,"%s", apple);
并没有将buffer写入文件, 怎么会这样abcdefghijapple?
我想和文件的缓冲是有关系的, 并且fwrite  和 fread 可以维系着不同的位置指针

buffer的内容已经变成abcdefghij
文件指针就在20,然后你再把apple加进去,
后面的内容当然就没有了。===》结果我没试

论坛徽章:
0
5 [报告]
发表于 2006-10-21 16:53 |只看该作者

回复 4楼 lonelyair 的帖子

原文件
// a.txt
1234567890abcdefghijklmnopqrstuvwxyz

执行程序 a.out
输出
// a.txt
1234567890abcdefghijklmnopqrstuvwxyz
abcdefghijapple

不是后面的内容没有了,是多了前面的内容啊 ^_^

论坛徽章:
0
6 [报告]
发表于 2006-10-21 16:54 |只看该作者
1.你的fread是读函数,fprintf是写函数。读写交替时应该加入fseek函数。这是必须的,具体原因可从函数实现源码中找到。
2。如果你把那行注释去掉后,fprintf(fp,"%s", “apple”);执行后a.txt中的内容应该是 1234567890abcdefghijklmnopqrstapplez

论坛徽章:
0
7 [报告]
发表于 2006-10-21 17:06 |只看该作者
我只是想看看 不加 有什么影响, 还是觉得和缓冲有关,故自己设置缓冲

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         char buffer[20] ="1234567890";
  5.         FILE * fp = fopen("a.txt","r+b");
  6.         char fbuffer[1024]="";
  7.        

  8.         if (setvbuf(fp, fbuffer, _IOFBF, sizeof fbuffer) != 0)
  9.                 perror("setvbuf");

  10.         fseek(fp, 2,  SEEK_CUR);
  11.         fread( buffer,1, 10,fp);

  12.        
  13. /*        fseek(fp, 10,  SEEK_SET);*/
  14. /*fflush(fp); */ /*call this func programme is run ok*/

  15.         fprintf(fp,"%s","apple");
  16.         fclose(fp);
  17.        
  18. }
复制代码


使用gdb调试:从fseek(fp, 2,  SEEK_CUR); 开始调试
执行 fseek(fp, 2,  SEEK_CUR);前
    p fbuffer   
           $1 = '\000' <repeats 1023 times>
执行 fseek(fp, 2,  SEEK_CUR); 后
   p fbuffer   
          $2= '\000' <repeats 1023 times>
执行 fread( buffer,1, 10,fp); 前
   p fbuffer
          $3 = "\000\000\000\000\000\000\000\00034567890abcdefghijklmnopqrstuvwxyz\n", '\000' <repeats 980 times>
执行 fprintf(fp,"%s","apple");前
   p buffer
         $4 = "\000\000\000\000\000\000\000\00034567890abcdefghijklmnopqrstuvwxyz\n", '\000' <repeats 980 times>
执行 fprintf(fp,"%s","apple");后
   $5= "\000\000\000\000\000\000\000\00034567890abapplehijklmnopqrstuvwxyz\n", '\000' <repeats 980 times


最后关闭文件, 引起缓冲到文件
        由于先fseek(2), 后读入10个字节 在写入5个字符 故先将后面的字符写入,在写入前面的字符 故得到输出结果

[ 本帖最后由 stuff990 于 2006-10-21 17:09 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-10-23 16:19 |只看该作者

回复 7楼 stuff990 的帖子

这么快就没下文了 唉

论坛徽章:
0
9 [报告]
发表于 2006-10-23 16:40 |只看该作者
原帖由 stuff990 于 2006-10-23 16:19 发表
这么快就没下文了 唉

或许是我没懂你的意思
也是我表述不到位

你看看它的汇编码是怎么走的,希望能解决你的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP