c - C 中的 fwrite() 函数未写出预期答案

标签 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() 之后 函数完成后,Debug模式下的v为:12593 12832 12576 8243 6542 64 6448 64 68 0

我不再学习C了,但我很好奇fread()如何从a.txt读取数字以及fwrite()如何将它们写入b.txt。我知道函数原型(prototype)以及它们通常如何工作,因为我使用它们编写了一些小程序:

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”。

关于c - C 中的 fwrite() 函数未写出预期答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48279779/

相关文章:

c - C 新手,错误 C2371 : 'error" : redefinition; diffrent basic types

c - 2 C中的数字 float 组

c# - 采用 List<T>[] 的 Action 委托(delegate)的问题

C信号量线程读取文件

c - 如何知道 C 语言中是否存在文件?

python - 实现部分c源代码

c++ - 什么时候我们需要在纯C++程序中使用结构体?纯 C++ 程序中是否需要结构?

java - 选择排序中的比较次数?

Objective-C 循环逻辑

php - 通过 php 表单发送电子邮件文件