C 中的 fread() 如何在 for 循环中工作?
How does fread() in C work inside a for loop?
我是 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() 函数在循环 for(k=0 ; k<366 ; k++)
中的行 fread(&t,sizeof(t),1,fin)
中实际上是如何工作的。显然,这里 fread() 的参数不依赖于循环变量 k
,因此它应该为每个 k
读取相同的数据到矩阵 t[31][31]
。但是,我已经检查过,令人惊讶的是,该程序提取的数据对于 if(k == 105)
行中 k
的不同值是不同的,即为 k == 105
和 [=20] 提取的数据=] 不同,例如。
如能解释以上内容,将不胜感激。
文件包含顺序数据。所有文件操作符都基于这样一个前提,即无论您对文件做什么,通常都是按顺序进行的。
因此,当您读取数据,然后读取更多数据时,您将获得文件的顺序块。 FILE 数据类型和操作系统本身都为您做了很多事情,包括跟踪您在文件中的当前位置以及在内存中进行块缓冲以提高性能。
如果您想重新读取相同的数据,或者在文件中跳过,您需要在进行下一次读取之前使用 fseek() 更改文件中的位置。
我是 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() 函数在循环 for(k=0 ; k<366 ; k++)
中的行 fread(&t,sizeof(t),1,fin)
中实际上是如何工作的。显然,这里 fread() 的参数不依赖于循环变量 k
,因此它应该为每个 k
读取相同的数据到矩阵 t[31][31]
。但是,我已经检查过,令人惊讶的是,该程序提取的数据对于 if(k == 105)
行中 k
的不同值是不同的,即为 k == 105
和 [=20] 提取的数据=] 不同,例如。
如能解释以上内容,将不胜感激。
文件包含顺序数据。所有文件操作符都基于这样一个前提,即无论您对文件做什么,通常都是按顺序进行的。
因此,当您读取数据,然后读取更多数据时,您将获得文件的顺序块。 FILE 数据类型和操作系统本身都为您做了很多事情,包括跟踪您在文件中的当前位置以及在内存中进行块缓冲以提高性能。
如果您想重新读取相同的数据,或者在文件中跳过,您需要在进行下一次读取之前使用 fseek() 更改文件中的位置。