免费注册 查看新帖 |

Chinaunix

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

求教:关于写文件问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-21 20:11 |只看该作者 |倒序浏览
我写了一个程序A,用于向磁盘文件写些东西 ,大致流程如下:
   用 fopen() 的“w+”方式打开一个文件,
   然后用 fwrite() 向里面写了些东西,
   然后调用 fflush()
    用 fclose() 关闭文件。

该程序写好后,用一个其他函数B,调用A进行文件保存操作,并在调用结束后打印出“--写文件结束--”。

问题是:
      如果我在B运行过程中看到打印出的“--写文件结束--”,此时按 Ctrl+C终止程序的运行,那么用程序C来读取保存的文件内容时,得到的结果是正确的。
      但是如果我在B运行的过程中看到打印出“--写文件结束--”后,直接关机,那么得到的结果就不确定了。有时候是正常的。有时候文件长度为0,有时候在读文件时出错。

个人意见:
      我怀疑是保存文件动作在打印出“--写文件结束--”时并没有结束。我查了一下 fflush() 函数。怀疑是
调用了该函数后,它将我写的数据保存到了硬盘的高速缓存中了,并没有真正写到磁盘上。

      那么我该如何操作,才能使按直接关机操作和按Ctrl+C 得到同样的结果呢?

论坛徽章:
0
2 [报告]
发表于 2006-09-21 21:52 |只看该作者
不要怀疑别的了,是你的代码问题,贴出来大家看看。

论坛徽章:
0
3 [报告]
发表于 2006-09-21 21:57 |只看该作者
原帖由 jcs4989 于 2006-9-21 20:11 发表
我写了一个程序A,用于向磁盘文件写些东西 ,大致流程如下:
   用 fopen() 的“w+”方式打开一个文件,
   然后用 fwrite() 向里面写了些东西,
   然后调用 fflush()
    用 fclose() 关闭文件。

该程序 ...

调用fflush后关机不一定能写入磁盘,fflush 只是刷新缓冲区到页面,sync才是刷新页面到磁盘,并且sync也是需要时间的
看一看fdisk的实现:

  1. sync();
  2. sleep( 2 );
复制代码

论坛徽章:
0
4 [报告]
发表于 2006-09-22 20:31 |只看该作者
代码如下:
int dcn_save_local(char *path_handin,char *filename_handin,struct dcn_local_info info)
{
        char *info_finished = "--- info finished ---";
        //char *path_handin = path;
        char fullpath[100];
        memset(fullpath,0x0,sizeof(fullpath));
        strcat(fullpath,path_handin);
        strcat(fullpath,filename_handin);
        printf(" the fullpath is %s\n",fullpath);
        FILE *f = fopen(fullpath,"w+");
        if(f == NULL){
                perror("create file to save local data failuer!");
                exit(1);
        }
        fwrite(&(info.pid),sizeof(pid_t),1,f);
        fwrite(&(info.sendid_stored),sizeof(struct msgid_send_type),1,f);
        fwrite(&(info.msg_item_sendid),sizeof(long),1,f);
        fwrite(&(info.msg_item_recvid),sizeof(long),1,f);
        fwrite(info_finished,strlen(info_finished)+1,1,f);
        fclose(f);
        fflush(f);
        return 0;
}

论坛徽章:
0
5 [报告]
发表于 2006-09-22 20:33 |只看该作者

继续

如三楼所说,我应该先调用fflush(),然后调用sync() ?.


感谢大家回复!  谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP