none
fprintf的问题 RRS feed

  • 问题

  • fopen_s(&fp, strDataPath, "a+"); if(fp == NULL) {  return -1; } int len = fprintf(fp, "%s\r\n", strData); if(len != strlen(strData)+2) {  return -1; }  fclose(fp);

    这段代码是写数据。这个时候假如fprintf失败,函数里面没有fclose(fp).此时函数已经返回了,这个时候我程序外面起了线程会把这个文件移走。此时没有close,文件肯定没办法移走。我很想模拟这种情况,但是不知道fprintf在什么情况下会失败。所以模拟一直没成功。因为这段代码是个高手写的,而且很久都没人动,我觉得应该在if(len != strlen(strData)+2)后面加上fclose(fp)。再return -1.

    请老师指导下fprintf一般在什么情况下会失败,我加上fclose是对还是错。谢谢解答,希望老师尽量详细,本人是小菜鸟

    2011年12月1日 1:34

答案

  • FILE* fp = NULL;
    
    	__try
    	{
    		fopen_s(&fp, strDataPath, "a+"); 
    		if(NULL == fp) 
    		{  
    			__leave;
    		} 
    
    		int len = fprintf(fp, "%s\r\n", strData); 
    
    		if(len != strlen(strData)+2) 
    		{  
    			__leave; 
    		}
    	}
    	__finally
    	{
    		if(fp)
    		{
    			fclose(fp);
    		}		
    	}
    

     


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年12月1日 8:27
    版主

全部回复

  • 你需要在fopen_s后,所有return前添加fclose.

    你可以把句柄封装在一个对象里,这个对象的构造函数中fopen_s,在析构中fclose。这样由于对象会在退出作用域析构。所以就不用担心没有调用fclose了。具体可以参考研究RAII Resource Acquisition Is Initialization


    麻烦把正确答案设为解答。
    2011年12月1日 3:12
    版主
  • FILE* fp = NULL;
    
    	__try
    	{
    		fopen_s(&fp, strDataPath, "a+"); 
    		if(NULL == fp) 
    		{  
    			__leave;
    		} 
    
    		int len = fprintf(fp, "%s\r\n", strData); 
    
    		if(len != strlen(strData)+2) 
    		{  
    			__leave; 
    		}
    	}
    	__finally
    	{
    		if(fp)
    		{
    			fclose(fp);
    		}		
    	}
    

     


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年12月1日 8:27
    版主