免费注册 查看新帖 |

Chinaunix

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

[C] 最近一直在搞fread() ,frwrite()函数,对于这两个函数总有点晕 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-08 20:36 |只看该作者 |倒序浏览
本帖最后由 冷寒生 于 2013-05-08 20:40 编辑

下面这个程序的作用是向文件添加书籍,利用fread()和fwrite();
fread()函数可以正常向文件读取,然后输入到控制台显示出来,(说明文件里面的内容是正确的)
可是fwrite()写入到文件后,直接打开文件,就会出现烫。。(说明这个二进制不应该用文本文件打开,那应该用什么软件打开查看了? 还有如果直接保存为dat格式的,可以直接查看吗?)

  1. // booksave.c
  2. # include <stdio.h>

  3. # include <stdlib.h>

  4. # define MAXTITL 40
  5. # define MAXAUTL 40
  6. # define MAXBKS 10

  7. struct book
  8. {
  9.     char title[MAXTITL];
  10.     char author[MAXAUTL];
  11.     float value;
  12. };                                                //注意结构类型后面要加分号

  13. int main (void)
  14. {
  15.     struct book library[MAXBKS];
  16.     FILE * pbooks;
  17.     int count = 0;
  18.     int size = sizeof (struct book);
  19.     int index;
  20.     int filecount;
  21.     if ((pbooks = fopen ("book.txt", "a+b")) == NULL)
  22.     {
  23.         printf ("bad.\n");
  24.         exit (1);
  25.     }
  26.     while (count < MAXBKS && fread (&library[count], size, 1, pbooks) ==1)
  27.     {
  28.         if (count == 0)
  29.             printf ("Current contents of book.txt: \n");
  30.         printf ("%s by %s: %.2f\n", library[count].title,
  31.                 library[count].author, library[count].value);
  32.         count++;
  33.     }
  34.     filecount = count;
  35.      
  36.     if (count == MAXBKS)
  37.     {
  38.         puts ("the bkskk");
  39.         exit (2);
  40.     }

  41.     puts ("please add new book titles.");
  42.     puts ("press [enter] at the start of a line to stop.");
  43.     while (count < MAXBKS && gets (library[count].title)
  44.                             && library[count].title[0] != '\0')
  45.     {
  46.         puts ("enter the author");
  47.         gets (library[count].author);
  48.         puts ("now enter the value.");
  49.         scanf ("%f", &library[count++].value);
  50.         while (getchar () != '\n')
  51.             continue;
  52.         if (count < MAXBKS)
  53.             puts ("enter the next title.");

  54.     }
  55.     if (count > 0)
  56.     {
  57.         puts ("here is the list of your books.");
  58.         for (index = 0; index < count; index++)
  59.         {
  60.             printf ("%s by %s : %.2f.\n", library[index].title,
  61.                                 library[index].author, library[index].value);

  62.         }
  63.         fwrite (&library[filecount], size, count - filecount, pbooks);
  64.     }
  65.     else
  66.     {
  67.         puts ("no book, ");

  68.     }
  69.     puts ("goodbye.");
  70.     fclose (pbooks);       //注意一定要关闭文件;

  71.     return 0;
  72. }
复制代码

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-05-08 21:34 |只看该作者
读写之间没有fseek啊, 导致缓冲区里遗留了数据, 再者导致fd的offset由于FILE缓冲区维护的原因没有移动到文件实际偏移量.

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
3 [报告]
发表于 2013-05-08 21:53 |只看该作者
回复 2# linux_c_py_php
LZ是以append模式打开,没有seek问题


   

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
4 [报告]
发表于 2013-05-08 21:57 |只看该作者
结构中的数组是定长的。而数据只占用了部分空间,后面的是垃圾数据。fwrite时将这些数据都写入了文件,所以会出现这种问题。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
5 [报告]
发表于 2013-05-09 17:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP