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

时间:2018-01-16 11:05:19

标签: c arrays file fwrite fread

大家好!

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

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。我知道prototipes的功能以及它们通常如何工作,因为我用它们编写了一些小程序:

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个字节,如果有帮助的话。

1 个答案:

答案 0 :(得分:1)

好的fwrite如下(来自tutorialspoint):

  

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的第一个char(因为几乎在每种情况下,char的大小都是1),它们是: '1', '1', ' ', '2', ' ', '1'.