【问题标题】:How a fread function work? [closed]fread 函数如何工作? [关闭]
【发布时间】:2012-10-28 19:07:43
【问题描述】:
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 元素的含义是什么,以及如何操作 size 和 count 以获得最大的流读取速度?

【问题讨论】:

  • 请编辑您的问题,说明您要达到的目标以及输入和预期输出应该是什么。

标签: c


【解决方案1】:

要打印int 中的所有字节?请记住,int 是 32 位的,即四个字节。将其读入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 一些字符指针[2] = 0x34 一些字符指针[3] = 0x12

如果您现在将someIntValue 更改为号码1

someIntValue = 1;

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

一些字符指针[0] = 0x00 一些字符指针[1] = 0x00 一些字符指针[2] = 0x00 一些字符指针[3] = 0x01

int 的内存布局

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

8 位 ,----^---。 | | +--------+--------+--------+--------+ |00111000|01010110|00110100|00010010| +--------+--------+--------+--------+ | | `-----------------v-----------------' | 32 位

这个int0x780x560x340x12这四个字节(或char)相同。

但是,如果我们将 int 更改为数字 1,那么它的存储方式如下:

8 位 ,----^---。 | | +--------+--------+--------+--------+ |00000000|00000000|00000000|00000001| +--------+--------+--------+--------+ | | `-----------------v-----------------' | 32 位

这个int0x000x000x000x01这四个字节(或char)相同。

所以现在您希望可以看到读取为int 并打印为char 将显示与读取和int 并打印为int 不同的结果。

【讨论】:

  • 当我使用 int 而不是 char 我没有得到答案...?
  • @user1781308 int != char。请告诉我们您想做什么,而不是仅仅显示一些代码并让我们猜测。预期的结果是什么?实际结果如何?
  • 我只是想弄清楚 fread 函数的用途..从标准输入读取数据。
  • 为什么我不能使用第二个程序...它给了我意想不到的值。
  • @user1781308 您告诉fread 将四个字节读入buffer,但您打印出四个ints。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2018-02-07
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多