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

时间:2012-10-25 09:09:37

标签: c file filesize fseek

我写了这个基本功能:

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”打开它,但仍然得到相同的不同数字..

3 个答案:

答案 0 :(得分:2)

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

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

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

你可能想尝试这样做:

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

(a)来自C99 7.19.6.1 The fprintf functionC11 7.20.6.1中未更改,等效部分:

  

fprintf函数将输出写入由stream指向的流,并在控制之下   格式指向的字符串,指定后续参数的方式   转换为输出。 如果格式的参数不足,则行为为   undefined。如果参数保留时格式已用尽,则多余的参数为   评估(一如既往),否则被忽略。 fprintf函数何时返回   遇到格式字符串的结尾。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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


未定义的行为 如果格式的参数不足,则结果未定义。如果参数保留时格式已用尽,则会评估多余的参数,否则将忽略这些参数。
http://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=printf