C 中的 fwrite() 函数不会写入预期的答案



大家好!

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

">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

在 fread() 之后 函数完成,调试模式下的 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

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

好吧,fwrite的工作原理如下(从教程点):

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

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

所以这条线

fwrite(v, 6, 1, g);

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

相关内容

最新更新