gpt4 book ai didi

c - 文件中特定值的位置

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:43 24 4
gpt4 key购买 nike

我有一个包含 5123 值的 C 二进制文件,其形式为 3 维立方体。我需要访问立方体中具有最高值的位置,即密度。获得最高值的位置后,我需要围绕该位置创建一个较小的 3D 立方体,其值明显小于 512(立方体的尺寸)。 start 表示较小立方体的一个角的位置。 p 显然是二进制文件。

fseek(p,0,SEEK_END);
lSize = ftell(p);
rewind(p);

dim = pow(lSize/sizeof(float),1.0/3.0);
printf("File size: %lu bytes, Grid size: %d \n", lSize,(int)dim);

max = 0;
counter = 0;
index = 0;
while(fread(&density,sizeof(float),1,p),!feof(p) && !ferror(p)) {
if(density > max) max = density,index = counter;
counter += 1;
}

sub = 256;
start = index - (pow(dim,2)+dim+1)*(sub/2-1);
printf("3d coordinates of highest density: %lu,%lu,%lu, Dimension of cube: %d\n",index % 512;(index / 512) % 512;index / (512 * 512),(int)dim);

printf("The maximum density is: %e with index: %lu \n", max,index);

rewind(p);
fseek(p,start*sizeof(float),SEEK_SET);
fseek(q,start*sizeof(float),SEEK_SET);
fseek(r,start*sizeof(float),SEEK_SET);
fseek(s,start*sizeof(float),SEEK_SET);
fseek(t,start*sizeof(float),SEEK_SET);

u = fopen("results_dens.dat", "w");
if (u == NULL) { printf("Unable to open output results file!"); exit(1); }

for (ibox=0;ibox<nbox;ibox++){
for (k=0;k<nz[ibox];k++){
fseek(p,(start+k*dim*dim)*sizeof(float),SEEK_SET);
fseek(q,(start+k*dim*dim)*sizeof(float),SEEK_SET);
fseek(r,(start+k*dim*dim)*sizeof(float),SEEK_SET);
fseek(s,(start+k*dim*dim)*sizeof(float),SEEK_SET);
fseek(t,(start+k*dim*dim)*sizeof(float),SEEK_SET);
for (j=0;j<ny[ibox];j++){
fseek(p,(start+j*dim+k*dim*dim)*sizeof(float),SEEK_SET);
fseek(q,(start+j*dim+k*dim*dim)*sizeof(float),SEEK_SET);
fseek(r,(start+j*dim+k*dim*dim)*sizeof(float),SEEK_SET);
fseek(s,(start+j*dim+k*dim*dim)*sizeof(float),SEEK_SET);
fseek(t,(start+j*dim+k*dim*dim)*sizeof(float),SEEK_SET);
for (i=0;i<nx[ibox];i++){

我知道上面的代码运行没有任何错误。但是,很多都依赖于上面的 index 的值。我不确定 C 中的位置是如何定义的。我知道这些是内存位置,但通过粗略计算,我得出的索引值似乎接近框的边缘而不是中心。

5123 = 134217728。index的值是66978048,距离67108864的中间位置值130816个位置。但是,130816大约是512*256意味着如果网格的中间位置在盒子的边缘,那么上面的 index 也是如此。

最佳答案

也许这会有所帮助。首先,我使用以下程序创建了一个测试文件:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int makeCube(const char *fn, int dim)
{
FILE *p;

const int center = dim/2;
p = fopen(fn,"w");
for (int i=0; i < dim; ++i)
for (int j=0; j < dim; ++j)
for (int k=0; k < dim; ++k) {
float f = dim - sqrtf(pow(i-center,2)+
pow(j-center,2)+pow(k-center,2));
fwrite(&f, sizeof(float), 1, p);
}
fclose(p);
return 0;
}
int main()
{
const int dim = 512;
makeCube("cube.bin", dim);
return 0;
}

接下来我重写了您的代码以使其具有正确的语法并打印一些似乎有用的诊断信息:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int subCube(FILE *p, int dim)
{
float density;
float max = 0;
long index = 0;
long counter;

for (counter=0; fread(&density,sizeof(float),1,p); ++counter) {
if(density > max) {
max = density;
index = counter;
}
}

printf("The maximum density is: %e with index: %lu \n", max,index);
int i = index/dim/dim;
int j = (index - (i*dim*dim))/dim;
int k = (index - ((i*dim)+j)*dim);
printf("This corresponds to coordinates (%d,%d,%d)\n", i,j,k);
}

int main()
{
const int dim = 512;
FILE *p = fopen("cube.bin","r");
subCube(p, dim);
fclose(p);
return 0;
}

当我运行该程序时,我得到以下输出:

The maximum density is: 5.120000e+02 with index: 67240192 
This corresponds to coordinates (256,256,256)

由于测试数据基本上是一个中间密度最大的球体,这完全符合预期。

请注意,我在错误处理方面玩得很随意(没有错误处理!),但为了清楚起见将其省略,而不是因为您实际上应该在实际程序中省略它。

关于c - 文件中特定值的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24943178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com