【问题标题】:file size is always changing , using C and fopen_s function文件大小总是在变化,使用 C 和 fopen_s 函数
【发布时间】: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" 打开它,但仍然得到相同的不同数字..

【问题讨论】:

    标签: c file filesize fseek


    【解决方案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

        【讨论】:

          猜你喜欢
          • 2011-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          相关资源
          最近更新 更多