C 中的 fwrite() 函数没有写出预期的答案

fwrite() function in C does not write the expected answer

大家好!

我在一本旧书中找到了编程练习:

a.txt文件的内容是:11 2 13 4 15 6 17 8 19。我们有以下 C 语言程序在 b.txt 文件中写入内容:

#include <stdio.h>

int main()
{
    FILE *f, *g;
    short int v[10];

    f = fopen("a.txt", "r");
    g = fopen("b.txt", "w");

    fread(v, 8, 1, f);
    fwrite(v, 6, 1, g);

    fclose(f); fclose(g);

    return 0;
}

我希望我的程序写入这些数字:11 2 13 .但相反,它写道:11 2 1

我试图通过调试器查看 v 数组会发生什么,但是 那里显示的值与我的计算不符。

在调用 fread() 之前,v 是这样未初始化的:6448 64 -108 96 6542 64 6448 64 68 0

恐惧之后() 函数完成,Debug模式下的v为:12593 12832 12576 8243 6542 64 6448 64 68 0

我不学C了,不过很好奇fread()是怎么从a.txt中读取数字,fwrite()是怎么写到b.txt中的。我知道函数原型以及它们通常如何工作,因为我使用它们编写了一些小程序:

int fread(void *p, int dim, int n, FILE *f);
//reads n elements from f, each one having dim bytes and stores them in p

int fwrite(void *p, int dim, int n, FILE *f);
//writes n elements in f from p, each one having dim bytes

但在这种特殊情况下,我很困惑。我什至尝试将我的数组类型从 short int 更改为 int,但结果是一样的。我检查了这本书,int 类型有 4 个字节,"short int" 有 2 个字节,如果有帮助的话。

fwrite 的工作原理如下(来自 tutorialspoint):

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

  • ptr - 这是指向要写入的元素数组的指针。
  • size - 这是要写入的每个元素的大小(以字节为单位)。
  • nmemb - 这是元素的数量,每个元素的大小为 size 字节。
  • stream - 这是指向指定输出流的 FILE 对象的指针。

所以这一行

fwrite(v, 6, 1, g);

从“11 2 13 4 15 6 17 8 19”写入 6 个字节。不要忘记,这一行中有空格。所以该函数写入第 6 个字符(因为在几乎所有情况下,字符的大小都是 1),它们是: '1', '1', ' ', '2', ' ', '1'.