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 関数は、後続の引数を出力用に変換する方法を指定する format が指す文字列の制御下で、stream が指すストリームに出力を書き込みます。フォーマットの引数が不十分な場合、動作は未定義です。引数が残っている間にフォーマットが使い果たされた場合、余分な引数は (いつものように) 評価されますが、それ以外の場合は無視されます。fprintf 関数は、フォーマット文字列の終わりに到達すると戻ります。

于 2012-10-25T09:13:41.150 に答える
1

fileSize を printf に追加するのを忘れました。代わりに、スタックまたはレジスタからランダムな情報を出力しています。

于 2012-10-25T09:13:51.490 に答える
0

paxdiablo が指摘したように、変数名を使用していません。その結果、printf はスタックにある値を取得して、それを出力しようとします。これは未定義の動作です。


未定義の動作 フォーマットの引数が不十分な場合、結果は未定義です。引数が残っている間にフォーマットが使い果たされた場合、余分な引数は評価されますが、それ以外の場合は無視されます。 http://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=printf
を参照してください。

于 2012-10-25T09:18:47.820 に答える