如何解决C 中的 fread() 如何在 for 循环中工作?
我是 C 编程的新手,但我需要它来读取我在下面描述的一些二进制文件。
印度气象部门 (IMD) 在其 website 中提供了 .Grd 文件中的历史天气数据。他们还提供了示例 C 代码来读取这些文件。从他们的示例 C 代码中,我编写了以下代码,用于提取 1980 年 4 月 15 日记录在印度 31x31 网格上的每日最低温度。
/* This program reads binary data for 365/366 days and writes in ascii file. */
#include <stdio.h>
int main() {
float t[31][31];
int i,j,k;
FILE *fin,*fout;
fin = fopen("C:\\New folder\\Mintemp_MinT_1980.Grd","rb"); // Input file
fout = fopen("C:\\New folder\\MINT15APR1980.TXT","w"); // Output file
fprintf(fout,"Daily Minimum Tempereture for 15 April 1980\n");
if(fin == NULL) {
printf("Can't open file");
return 0;
}
if(fout == NULL) {
printf("Can't open file");
return 0;
}
for(k=0 ; k<366 ; k++) {
fread(&t,sizeof(t),1,fin);
if(k == 105) {
for(i=0 ; i < 31 ; i++) {
fprintf(fout,"\n") ;
for(j=0 ; j < 31 ; j++)
fprintf(fout,"%6.2f",t[i][j]);
}
}
}
fclose(fin);
fclose(fout);
return 0;
}
/* end of main */
文件 Mintemp_MinT_1980.Grd
可以从 IMD website 下载,选择年份为 1980 与最低温度。
我不明白的是,fread() 函数在循环 fread(&t,fin)
内的行 for(k=0 ; k<366 ; k++)
中实际上是如何工作的。显而易见,这里 fread() 的参数不依赖于循环变量 k
,因此它应该为每个 t[31][31]
将相同的数据读取到矩阵 k
。但是,我查了一下,出人意料的是,对于k
行中不同的if(k == 105)
值,该程序提取的数据是不同的,即为k == 105
和{{1}提取的数据}} 是不同的,例如。
如果有人能解释以上内容,我将不胜感激。
解决方法
文件包含顺序数据。所有文件操作符都基于这样一个前提:无论您对文件做什么,您通常都会按顺序进行。
因此,当您读取数据,然后读取更多数据时,您将获得文件的连续块。 FILE 数据类型和操作系统本身都会为您做很多事情,包括跟踪您在文件中的当前位置以及在内存中进行块缓冲以提高性能。
如果您想重新读取相同的数据,或在文件中跳过,您需要在下一次读取之前使用 fseek() 更改文件中的位置。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。