一个fread功能如何工作?

时间:2012-10-28 19:07:44

标签: c

int main()

{


  char  buffer[100];
  fread(buffer,1,4,stdin);
  int i=0;
  while(i<4)

  {
    printf ("%c,\n",buffer[i]);

    i=i+1;
  }

 getch();

}

fread函数如何知道,何时停止读取输入流,size和count元素表示什么,以及如何操作大小和计数以获得最大流读取速度?

1 个答案:

答案 0 :(得分:1)

打印int中的所有字节?请记住,int是32位,即4个字节。将其读入char缓冲区可以更轻松地访问int中的这四个字节。

修改:对int类型的解释很少......

假设您有int

int someIntValue = 0x12345678;

它以32位存储在存储器中。由于单个字节(char)是8位,因此int有四个字节。可以使用int数组或指针访问char中的每个字节:

char *someCharPointer = (char *) &someIntValue;

现在您可以访问这四个单独的字节,并查看它们的值:

for (int i = 0; i < sizeof(int); i++)
    printf("someCharPointer[%d] = 0x%02x\n", i, someCharPointer[i]);

以上将打印(在x86等小端机器上):

someCharPointer[0] = 0x78
someCharPointer[1] = 0x56
someCharPointer[2] = 0x34
someCharPointer[3] = 0x12

如果您现在将someIntValue更改为数字1

someIntValue = 1;

再次打印出来,你会看到这个结果:

someCharPointer[0] = 0x00
someCharPointer[1] = 0x00
someCharPointer[2] = 0x00
someCharPointer[3] = 0x01

int

的内存布局

如果你有一个int类型的变量存储在内存中,其值为0x12345678,它的存储方式如下:

   8 bits
,----^---.
|        |

+--------+--------+--------+--------+
|00111000|01010110|00110100|00010010|
+--------+--------+--------+--------+

|                                   |
`-----------------v-----------------'
                  |
               32 bits

int与四个字节(或char0x780x560x340x12相同。

但是,如果我们将int更改为数字1,则会将其存储为:

   8 bits
,----^---.
|        |

+--------+--------+--------+--------+
|00000000|00000000|00000000|00000001|
+--------+--------+--------+--------+

|                                   |
`-----------------v-----------------'
                  |
               32 bits

int与四个字节(或char0x000x000x000x01相同。

所以现在你希望看到如何以int阅读和打印为char将如何显示与阅读和int不同的结果并将其打印为int