大家好!
我在一本旧书中找到了一个编程练习:
“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/