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