我在写一个函数来存储位置向量(pos_x,pos_y,pos_z)到动态数组中,但是使用fscanf将值读入数组时出现访问冲突错误,不确定是否是内存分配错误(它应该是正确的,因为它是从另一个函数中获取的),或者值被错误地读取。initial_positions.txt文件中的位置矢量是这样的格式(没有头):
pos_x, pos_y, pos_z
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
我的职务:
int main()
{
int numberOfBodies = 5;
ReadInitialPositions(numberOfBodies);
return 0;
}
double **ReadInitialPositions(int numberOfBodies)
{
int row = 0;
int column = 0;
double **initialPositions = malloc(sizeof(double*) * numberOfBodies);
for (row = 0; row < numberOfBodies; row++)
{
initialPositions[row] = malloc(sizeof(double) * 3);
}
for (row = 0; row < numberOfBodies; row++)
{
for (column = 0; column < numberOfBodies; column++)
{
printf(" %lf", initialPositions[row][column]);
}
printf("\n");
}
FILE *file = fopen("initial_positions.txt", "r");
if (file == NULL)
{
printf("\nUnable to access the 'initial_positions.txt' file.\n");
exit(1);
}
else
{
while (fscanf(file, "%lf %lf %lf", &initialPositions[row][column], &initialPositions[row][column + 1], &initialPositions[row][column + 2]) != EOF)
{
printf("%lf", initialPositions[row][column]);
row++;
}
}
fclose(file);
free(initialPositions);
return initialPositions;
}
真的很感激任何帮助:)
1条答案
按热度按时间6pp0gazn1#
1.您在第一个循环中分配并显示未初始化的数据,但在尝试将数据读入数组之前不重置
row
和column
,因此写入超出了界限。1.列边界不正确(应为
3
,而不是numberOfBodies
)。1.阅读数据时,同时使用列索引和手动索引。由于不对列进行迭代,因此只需对列索引进行硬编码。
1.检查
fscanf()
是否确实读取了您期望的3个字段,否则这些变量未初始化。1.不要释放刚刚读取的数据,因为您正在将其返回给调用方。
1.使用常量而不是硬编码幻值3。
输出为:
下面是一个更通用的版本,它可以计算出文件中有多少行: