0

我写了这个基本功能:

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

4

3 回答 3

2

由于以下行,您会获得不同的文件大小:

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 函数返回。

于 2012-10-25T09:13:41.150 回答
1

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

于 2012-10-25T09:13:51.490 回答
0

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


Undefined behavior The results are undefined if there are insufficient arguments for the format. If the format is exhausted while arguments remain, the excess arguments are evaluated but are otherwise ignored.
See http://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=printf

于 2012-10-25T09:18:47.820 回答