Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中从结构打印int数组_C - Fatal编程技术网

在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该数组