我对编程很陌生,有C和C++的基本知识。我一直在尝试在用于图像分析的.dat文件上运行代码。
基本上,这个.dat文件具有集群的x和y位置以及它们的半径。使用此代码,我尝试将我的图像(缩放像素后尺寸为 200mm x 300mm(划分为 5mm x 5mm 的网格,并找到半径 = 1 的点数和半径 = 100 的点数。
这是我的代码:
#include<stdio.h>
int main()
{
int i=0,g,h,ng[350][250],ns[350][250],ntot[350][250];
float a[6001],b[6001],c[6001];
FILE *fres1, *fres2;
for(g=5;g<=350;g=g+5)
{
for(h=5;h<=250;h=h+5)
{
ng[g][h]=0;
ns[g][h]=0;
ntot[g][h]=0;
}
}
fres1 = fopen("trial_final_1.dat","r+");
fres2 = fopen("result_boxes.dat","w");
if(fres1 == NULL)
{
printf("Error!! Cannot open file n" );
return 1;
}
else
{
printf("File opened successfully, kindly check your folder for result_boxes file :) n");
fprintf(fres2,"x(mm) y(mm) no. of glass beads no. of stain-less steel balls total no. of balls n");
while(!feof(fres1))
{
fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i]);
g = ((a[i]/5) + 1)*5;
h = ((b[i]/5) + 1)*5;
if(c[i] == 100)
{
ng[g][h] = ng[g][h]+1;
}
else
{
ns[g][h] = ns[g][h] + 1;
}
ntot[g][h] = ntot[g][h] + 1;
++i;
}
g = 5;
h = 5;
for(g=5;g<=350;g=g+5)
{
for(h=5;h<=250; h=h+5)
{
fprintf(fres2,"%d %d %d %d %dn",g,h,ng[g][h],ns[g][h],ntot[g][h]);
}
}
}
fclose(fres1);
fclose(fres2);
return 0;
}
我的输入.dat文件(即"trial_final_1.dat"(包含的数据如下:
150.505951 0.797619 100.000000
172.327438 5.976130 100.000000
137.538651 11.089217 100.000000
151.304276 10.139803 100.000000
137.008926 13.175000 100.000000
120.400734 13.943015 1.000000
136.759262 14.199074 100.000000
在运行我的代码时,最初我得到输出"文件成功打开,请检查您的文件夹中是否有result_boxes文件:)",但在此之后我收到一条消息,说该文件.exe已停止工作。请帮我解决这个问题。我也尝试使用 while(fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i])!=EOF )
而不是 while(!feof(fres1))
,但两种情况下的输出保持不变。
您没有对数组进行任何边界检查。 快速浏览一下代码表明,您正在通过以下循环超越ng
、ns
和ntot
的界限:
for(g=5;g<=350;g=g+5)
{
for(h=5;h<=250; h=h+5)
{
...
}
}
上面的问题是你使用的是<=
而不是<
,或者你的数组维度是一个太小的元素。
在写入文件句柄之前,也不会检查fres2
是否为有效的文件句柄,也不会检查对fscanf
的调用是否成功。 例如:
fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i]);
g = ((a[i]/5) + 1)*5;
h = ((b[i]/5) + 1)*5;
如果上述调用失败,您可能正在使用未初始化的值来表示a[i]
或b[i]
,然后您继续将其用作数组索引,而无需进行任何边界检查。 这是灾难的秘诀,它可能总是会发生,因为您的循环会在您尝试读取之前检查 EOF。
至少你应该这样做:
if( 3 != fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i]) ) break;
还有一件事... 您认为当i
达到 6001 值时会发生什么?