在计算文件大小时混淆但有趣的C行为

时间:2014-12-26 03:10:36

标签: c

我正在编写一个非常简单的C程序来计算文件的大小。我在计算text,.odt和二进制文件方面都取得了成功。但是,在我对代码进行了一些小的更改之后,我得到了.odt和二进制文件的不同结果。

这是我的代码,可以提供正确的结果:

while(fgetc(pFile)!=EOF) size++;

这就是为二元和odt文件提供不同和错误结果的那个(我无法理解它为什么不同?)

   size=0; 

   c=fgetc(pFile);

   while(c!=EOF)
   {

      c=fgetc(pFile); 
      size++;
   }

注意:此代码为文本文件提供了正确的结果。

这是整体代码(功能):

 int count(char * file)
 {
     int size;
     char c;
     FILE * pFile;

     size=0;
     c=' ';

     pFile = fopen(file, "rb");
     if(!pFile)
     {
        printf("Invalid file(%s)!\n",file); 
        exit(EXIT_SUCCESS);
     }

     c=fgetc(pFile);
     while(c!=EOF)
     {
        c=fgetc(pFile); 
        size++;
     }
     // while(fgetc(pFile)!=EOF) size++;

     fclose(pFile);

     return size;
}

3 个答案:

答案 0 :(得分:1)

我很确定这是c的声明。这是一些有效的示例代码。

#include <stdio.h>
#include <errno.h>

int fsize(char *s)
{
    FILE *pF = NULL;
    int c = 0;  /* declaring this as char will bring you funny results */
    int iSize = 0;

    pF = fopen(s, "r");
    if (! pF)
    {
        perror("Cannot open file");
        return -1;
    }

    fseek(pF, 0, SEEK_SET);

    while(EOF != (c = fgetc(pF)))
        iSize ++;

    fclose(pF);

    return iSize;
}

int main(int argc, char **argv)
{
    int i;

    for(i = 1; argc > i; i ++)
        printf("%10d  %s\n", fsize(argv[i]), argv[i]);

    return 0;
}

答案 1 :(得分:-2)

我不确定你是什么意思&#34;计算文件的大小&#34;。 但是如果你想要文件大小,

我希望以下代码。

#include <sys/stat.h>

struct stat sbuf;

stat(filepath, &sbuf);

printf("%jd\n", (intmax_t)sbuf.st_size);

答案 2 :(得分:-2)

我相信你的文件大小比实际大小要小一些   我认为造成这种情况的原因是c=fgetc(pFile);被写了两次。一个在外面,一个在里面。控件执行第一个c=fgetc(pFile);,一次又一次进入内部,同时执行c=fgetc(pFile);而不增加大小。

   size=0; 
   c=fgetc(pFile);
   if(c!=EOF)
   {
     size++;
   }
   while(c!=EOF)
   {

      c=fgetc(pFile); 
      size++;
   }

这里,如果文件为空,fgetc将返回EOF。因此,只有当c返回的值不是EOF时,我们才会增加。   这应该解决这个问题。希望这有帮助。