在C中从结构打印int数组
我试图从文件中读入结构,然后显示(和排序)和数组。我有麻烦,但我认为这是由于我没有访问正确的记忆。当我打印数组时,它以随机数的形式出现在C中从结构打印int数组,c,C,我试图从文件中读入结构,然后显示(和排序)和数组。我有麻烦,但我认为这是由于我没有访问正确的记忆。当我打印数组时,它以随机数的形式出现 struct details { int numberOfPresents; int numberOfBuildings; int buildings[]; }; void print_int_array(const int *array) { for(int i=0; i<200; i++) pri
struct details
{
int numberOfPresents;
int numberOfBuildings;
int buildings[];
};
void print_int_array(const int *array)
{
for(int i=0; i<200; i++)
printf("%d | ", array[i]);
putchar('\n');
}
void sort(int buildings[], int count)
{
int i, j, temp;
do {
j = 0;
for (i = 0;i<count-1;i++)
{
if (buildings[i] < buildings[i+1])
{
j = 1;
temp = buildings[i];
buildings[i] = buildings[i+1];
buildings[i+1] = temp;
}
}
} while (j == 1);
}
int main()
{
FILE *fp;
fp = fopen("buildings.out", "r");
struct details data1;
size_t structSize = sizeof(struct details);
//size_t arraySize = sizeof(int)*sizeof(buildings);
fread(&data1, structSize, 1, fp);
for(int i=0; i<200; i++)
printf("%d | ", data1.buildings[i]);
//sort(data1.buildings );
//print_int_array(data1.buildings, arraySize);
//printf("Number of Houses: %d\n",numberOfHouses(data1.numberOfPresents, data1.buildings));
fclose(fp);
return 0;
}
struct详细信息
{
国际货币基金组织;
国际大厦数目;
国际大厦[];
};
无效打印整数数组(常量整数*数组)
{
对于(inti=0;i您在打印数据时遇到两个问题
- 没有为记录分配足够的空间
- 没有为记录读取足够的数据
行struct details data1
在堆栈上只为struct
的一个副本分配了足够的空间。您需要足够的空间来容纳200个副本。我会立即建议使用数组
struct details data1[200];
当您执行读取时,fread(&data1,structSize,1,fp)
,您只读取一条大小为structSize
的记录。现在您已经分配了足够的内存来读取200条记录,您可以将正在读取的记录数也增加到200条
fread(data1, structSize, 200, fp);
(请注意,我们删除了&
,因为我们现在处理的是数组。如果只按名称引用数组,则数组会自动返回其基址。)
现在,如果文件中没有200条记录怎么办?您可能需要捕获fread()
的返回值来确定实际读取的记录数
int intNumberOfRecords = fread(&data1, structSize, 200, fp);
for(int i=0; i<intNumberOfRecords ; i++)
[...]
最后一个成员,buildings[]
,无法正确读取文件。这是因为在32位内存模型中,它最多只能是一个32位整数。换句话说,从磁盘读取的只是一个指向内存中某个位置的32位数字。最终不会得到包含建筑物的数组。如果您尝试访问它(即,在排序
例程中)很可能出现seg故障,程序将永远无法运行。尝试发布解决方案超出了我的回答范围。我只想说,您必须使用固定大小的数组,或者将可变大小的数组动态写入磁盘(可变长度记录)。固定大小的数组会容易得多。如果我们将您的定义更改为以下内容,我们将从磁盘加载一些数据
struct details{
int numberOfPresents;
int numberOfBuildings;
int buildings[16];
};
我们还可以避免seg错误,这是一个不错的优点。但是,我不知道您的输入文件是什么样子,所以我不知道在给定数据的情况下这是否有效。打印数据时遇到两个问题
- 没有为记录分配足够的空间
- 没有为记录读取足够的数据
行struct details data1
在堆栈上只为struct
的一个副本分配了足够的空间。您需要足够的空间来容纳200个副本。我会立即建议使用数组
struct details data1[200];
当您执行读取时,fread(&data1,structSize,1,fp)
,您只读取一条大小为structSize
的记录。现在您已经分配了足够的内存来读取200条记录,您可以将正在读取的记录数也增加到200条
fread(data1, structSize, 200, fp);
(请注意,我们删除了&
,因为我们现在处理的是数组。如果只按名称引用数组,则数组会自动返回其基址。)
现在,如果文件中没有200条记录怎么办?您可能需要捕获fread()
的返回值来确定实际读取的记录数
int intNumberOfRecords = fread(&data1, structSize, 200, fp);
for(int i=0; i<intNumberOfRecords ; i++)
[...]
最后一个成员,buildings[]
,无法正确读取文件。这是因为在32位内存模型中,它最多只能是一个32位整数。换句话说,从磁盘读取的只是一个指向内存中某个位置的32位数字。最终不会得到包含建筑物的数组。如果您尝试访问它(即,在排序
例程中)很可能出现seg故障,程序将永远无法运行。尝试发布解决方案超出了我的回答范围。我只想说,您必须使用固定大小的数组,或者将可变大小的数组动态写入磁盘(可变长度记录)。固定大小的数组会容易得多。如果我们将您的定义更改为以下内容,我们将从磁盘加载一些数据
struct details{
int numberOfPresents;
int numberOfBuildings;
int buildings[16];
};
我们还可以避免seg错误,这是一个不错的优点。但是,我不知道您的输入文件是什么样子,所以我不知道在给定数据的情况下这是否有效。您的结构的大小只包括对数组的最小分配(我想是一个条目)。它实际上没有为您想要的200个条目分配足够的资源。有一些可能的修复方法
如果总是200个条目,那么只需将建筑物声明为大小为200。这是最简单的
如果您在阅读之前知道条目的数量,那么您可以做一些不愉快的事情,例如(s是条目的数量):
完成后释放数据1。这种类型的代码通常不受欢迎,但过去很常见。read命令也变得复杂
最后一个选项是将建筑物更改为int*并在读取之前malloc该数组。同样,读取必须在循环中完成。结构的大小只包括数组的最小分配(我认为是一个条目)。它实际上没有为您想要的200个条目分配足够的资源。有一些可能的修复方法
如果总是200个条目,那么只需将建筑物声明为大小为200。这是最简单的
如果您在阅读之前知道条目的数量,那么您可以做一些不愉快的事情,例如(s是条目的数量):
完成后释放数据1。这种类型的代码通常不受欢迎,但过去很常见。read命令也变得复杂
最后一个选项是将建筑物更改为int*,然后在读取之前malloc该数组