免费注册 查看新帖 |

Chinaunix

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

[C] 咨询一个弱弱的文件指针问题,大侠帮帮忙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-11 10:17 |只看该作者 |倒序浏览
使用C/C++的文件指针 FILE 操作文件,如果fopen文件以后不fclose文件是否会造成内存泄漏??
查了n多资料都没说明,用valgrind测试程序也不报警报错。

我是想实现类似文本编辑器的修改功能:
fopen打开原文件,读取原文件内容;同时fopen新建一个副本文件,将修改的原文件内容写入副本文件。
修改完成后,副本文件正常fclose;原文件不fclose直接remove
最后rename改名副本文件,改成原文件名。

这fopen了原文件,而不fclose原文件直接删除,会造成内存泄漏或者其他问题吗???

论坛徽章:
0
2 [报告]
发表于 2009-06-11 11:02 |只看该作者
不会产生内存泄漏。在你的程序结束退出后,操作系统会自动关闭文件。但是如果你的程序在运行时打开了很多文件,并且都没有关闭的话,你的程序可能会无法继续运行。可能会无法打开新的文件,也可能会引起程序崩溃。

论坛徽章:
0
3 [报告]
发表于 2009-06-11 11:05 |只看该作者
应该不会有内存泄漏

论坛徽章:
0
4 [报告]
发表于 2009-06-11 11:14 |只看该作者
原帖由 yug1129 于 2009-6-11 11:02 发表
不会产生内存泄漏。在你的程序结束退出后,操作系统会自动关闭文件。但是如果你的程序在运行时打开了很多文件,并且都没有关闭的话,你的程序可能会无法继续运行。可能会无法打开新的文件,也可能会引起程序崩溃。



按照您的思路试了一下,确实循环到一定数量就不能再打开文件了:
#include <stdio.h>
#include <stdlib.h>

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i;
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j;
&nbsp;&nbsp;&nbsp;&nbsp;FILE    *fp   = NULL;  
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;j = 0;
&nbsp;&nbsp;&nbsp;&nbsp;while( 1 )
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp = fopen( "test.dat", "wb+" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( fp==NULL )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("NULL fp j=%d!n", j);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove( "test.dat" );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j++;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return 1;
}


[mgqw@localhost Desktop]$ cc at.c
[mgqw@localhost Desktop]$ ./a.out
NULL fp j=1021!

论坛徽章:
0
5 [报告]
发表于 2009-06-11 11:14 |只看该作者
而打开fclose屏蔽的话,程序会一直无限循环下去。

论坛徽章:
0
6 [报告]
发表于 2009-06-11 11:22 |只看该作者
漏文件? 描述符吧?

论坛徽章:
224
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:1015-16赛季CBA联赛之四川
日期:2023-07-25 16:53:45操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
7 [报告]
发表于 2009-06-11 11:48 |只看该作者

回复 #1 mgqw 的帖子

小样,你这样就能把OS搞掉?太黑客了

论坛徽章:
0
8 [报告]
发表于 2009-06-11 14:43 |只看该作者
突发奇想,在remove文件以后试试fcolse发现不会报段错误,循环能一直执行下去。
文件都删除了,文件描述符号还在,还能对其进行操作??

  1. int main()
  2. {
  3.         int                i;
  4.         int                j;
  5.         FILE    *fp   = NULL;  
  6.         char        str[256];
  7.         double  a;
  8.         strncpy( str, "   1234.5678", 256 );
  9.         j = 0;
  10.        

  11.         while( 1 )
  12.         {
  13.                 i = -1;
  14.                 fp = fopen( "test.dat", "wb+" );
  15.                 if( fp==NULL )
  16.                 {
  17.                         printf("NULL fp j=%d!\n", j);
  18.                         return -1;
  19.                 }
  20.                 //文件这里就删除了
  21.                 remove( "test.dat" );
  22.                 //不会出段错误
  23.                 i = fwrite( str, strlen(str), 1, fp );
  24.                 //这里还是不会出段错误
  25.                 fclose(fp);
  26.                 fp = NULL;
  27.                 printf( "j=%d i=%d\n", j, i );
  28.                 j++;
  29.         }

  30.         return 1;
  31. }
复制代码

[ 本帖最后由 mgqw 于 2009-6-11 14:45 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-06-12 01:09 |只看该作者
一个进程中打开的文件,如果在中间对这个文件unlink或者remove后,文件内容应该还在吧,在进程结束前是不是还可以正常的去读写这个文件呢

论坛徽章:
0
10 [报告]
发表于 2009-06-12 09:59 |只看该作者
原帖由 xman1101 于 2009-6-12 01:09 发表
一个进程中打开的文件,如果在中间对这个文件unlink或者remove后,文件内容应该还在吧,在进程结束前是不是还可以正常的去读写这个文件呢

应该是这样的,我把文件删除了,再fwrite  fread都可以,代码如下:

  1. int main()
  2. {
  3.         int                i;
  4.         int                j;
  5.         FILE    *fp   = NULL;  
  6.         char        str[256];
  7.         char        str1[256];
  8.         double  a;
  9.         strncpy( str, "111111111111111111111234.5678", 256 );
  10.          
  11.         memset( str1, 0, 256 );
  12.         j = 0;
  13.         while( j<1 )
  14.         {
  15.                 i = -1;
  16.                 fp = fopen( "test.dat", "wb+" );
  17.                 if( fp==NULL )
  18.                 {
  19.                         printf("NULL fp j=%d!\n", j);
  20.                         return -1;
  21.                 }
  22.                 //文件已经删除
  23.                 remove( "test.dat" );
  24.                //后面这些操作仍然可以
  25.                 i = fwrite( str, strlen(str), 1, fp );
  26.                 fseek( fp, 0, SEEK_SET );               
  27.                 i = fread( str1, strlen(str), 1, fp );
  28.                
  29.                 fclose(fp);
  30.                 fp = NULL;
  31.                 printf( "j=%d i=%d \nstr=%s\nstr1=%s\n", j, i, str, str1 );
  32.                 j++;
  33.         }

  34.         return 1;
  35. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP