文件大小总是在变化,使用 C 和 fopen_s 函数

Posted

技术标签:

【中文标题】文件大小总是在变化,使用 C 和 fopen_s 函数【英文标题】:file size is always changing , using C and fopen_s function 【发布时间】:2012-10-25 09:09:37 【问题描述】:

这个基本函数是我写的:

int save_files(PCHAR fileName)
 
     errno_t         err;
     FILE*           pFile    =    NULL;

do

    if (!fileName)
    
        printf("Input is NULL \n");
        break;
    


    err = fopen_s( &pFile, fileName, "r");
    if(0 != err)
    
        printf("The file %s was not opened for reading\n", fileName);
    
    else
    
       printf("The file %s was opened for reading \n", fileName);
    

    /*getting the fileSize */
    fileSize    =   dbg_getFileSize(pFile);
    printf("############# FILE SIZE IS :  %d #############\n" );
 

这是获取文件大小的函数:

UINT32 dbg_getFileSize(FILE *file)
 
        UINT32  size = 0 ;

         if (file == NULL)
            

            return -1;
             

         fseek(file , 0L , SEEK_END);
         size = ftell(file);
         fseek(file, 0L, SEEK_SET);/*set it to the head!!! */

         return size;

     

我总是打开相同的路径,每次都得到不同的大小 我尝试用 "r" 和 "rb" 打开它,但仍然得到相同的不同数字..

【问题讨论】:

【参考方案1】:

您会得到不同的文件大小,因为以下行:

printf("############# FILE SIZE IS :  %d #############\n" );

实际上并没有指定您要打印的变量。因此,当你调用它时,它可能会得到堆栈上的任何垃圾(我说可能,但是 任何事情 都可能发生,因为你已经调用了可怕的“未定义行为”(a)支持>)。

你可能想试试这个:

printf("############# FILE SIZE IS :  %d #############\n", fileSize );

(a) 来自C99 7.19.6.1 The fprintf function,在C11 7.20.6.1 中不变,等效部分:

fprintf函数将输出写入stream指向的流,受控制 format 所指向的字符串的名称,该格式指定后续参数的方式 转换为输出。 如果格式的参数不足,则行为是 未定义。 如果格式已用尽而参数仍然存在,则多余的参数将 评估(一如既往),但在其他方面被忽略。 fprintf 函数在何时返回 遇到格式字符串的结尾。

【讨论】:

【参考方案2】:

您忘记将 fileSize 添加到您的 printf 中,而是从堆栈或寄存器中打印随机信息。

【讨论】:

【参考方案3】:

正如 paxdiablo 指出的那样,您没有使用变量名。因此,printf 将获取堆栈上的值并尝试打印它 - 这是一种未定义的行为。

未定义的行为 如果格式的参数不足,则结果未定义。如果格式已用尽而参数仍然存在,则评估多余的参数,否则将被忽略。 见http://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=printf

【讨论】:

以上是关于文件大小总是在变化,使用 C 和 fopen_s 函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言打开其他目录下的文本文件

从文件夹输入数据到控制台程序 c方式

VS中fopen_s函数的用法(fopen函数的扩展)

opencv出现问题,错误error C2660: “fopen_s”: 函数不接受 2 个参数

C语言中的fopen函数的具体实现是怎么样?

为啥查看WINDOWS文件夹的属性里大小在不断变化呢?