【问题标题】:fwrite() function in C does not write the expected answerC 中的 fwrite() 函数没有写出预期的答案
【发布时间】:2023-08-20 01:49:01
【问题描述】:

大家好!

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

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 中的。我知道函数原型以及它们通常是如何工作的,因为我使用它们编写了一些小程序:

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 个字节。

【问题讨论】:

  • 是的,你读了 8 个 bytes,然后你写了 6 个 bytesfreadfwrite 函数不处理文本,而是处理原始字节。
  • 谢谢!它读取“11 2 13”并写入“11 2 1”,因为它读取每个字符,包括空格。我刚刚问了一个多么愚蠢的问题=))
  • v 数组的内容,如在调试器中所见,如果您将其类型更改为 char,它将提供更多信息。您的调试器可能能够重新解释具有不同类型的变量,因此您可能不必重新编译程序来执行此操作。
  • 你是对的!我更改了 char 中的类型,并使用 for 循环打印每个字符 v[i],然后再将其写入 b.txt。谢谢你的建议!

标签: c arrays file fwrite fread


【解决方案1】:

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'.

【讨论】:

  • 谢谢!我意识到,在一个自称“一些程序员老兄”的用户告诉我这些函数实际上是读/写字符之后。我想了一会儿他们读/写整数,这就是为什么我无法理解答案的“错误”!