C - 在二进制文件中添加整数数组

C - Add an array of integers in a binary file

提问人:redneck10 提问时间:12/17/2022 最后编辑:ptsredneck10 更新时间:12/17/2022 访问量:200

问:

我必须在二进制文件中添加一个作为参数传递的 int 数组作为函数的参数。在函数的参数中,还有数组的大小。 如果文件为空,我们写入数组,但如果文件已经包含数组,我们将两个数组连接起来。 我担心的是,每次处决时,我都会被报告崩溃。 这是我的代码:

void appendIntArray(char* filename, int* array, int N){                                          
                                             
    int* buffer = (int*) malloc(sizeof(int)*200);                                            
    FILE* fp;                                            
                                             
    if(fp == NULL) {                                             
        return(N);                                           
    }                                            
                                             
    fp = fopen(filename, "rb");                                          
    fread(N, sizeof(int), 1, fp);                                            
    fread(buffer, sizeof(int), N, fp);                                           
    fclose(fp);                                          
                                             
    fp = fopen(filename, "wb");                                          
    fwrite(&N, sizeof(int), 1, fp);                                          
    fwrite(buffer, sizeof(int), 1, fp);                                          
    fwrite(array, sizeof(int), N, fp);                                           
                                             
    fclose(fp);                                          
    return(N, buffer,array);                                             
}                                            

` 有人可以告诉我为什么我的程序崩溃并纠正我。

如果文件是空的,我们应该有一个数组。如果文件已经包含一个数组,我应该连接两个数组。

C 文件 fwrite fread fclose

评论

2赞 Barmar 12/17/2022
您不能从声明为 return 的函数中返回某些内容。而且你不能在 C 中返回多个值,你需要将它们作为结构返回。void
3赞 Barmar 12/17/2022
第一个参数 to 必须是指针,所以必须是 。但是,如果您从文件中读取 N,为什么它是一个函数参数?fread()N&N
2赞 Barmar 12/17/2022
您应该从第一行收到编译器警告。fread
0赞 redneck10 12/17/2022
感谢大家的建议!我在 fread() 中将 N 更改为 &N,并将返回值更改为 但现在,它返回数字的地址,而我已经打印了 &N、&buffer 和 &tab。我还能做些什么?printf("%d %d %d" ,&N, &buffer, &tab);
1赞 Barmar 12/17/2022
指针应使用格式打印,而不是 .不过,我不确定你为什么要打印指针。什么是?%p%dtab

答:

1赞 Barmar 12/17/2022 #1

在分配缓冲区之前,请从文件中读取当前长度。与此相加可得到最终结果数组的大小,并在 中使用它。然后,您可以使用将新数组复制到旧文件内容之后的缓冲区末尾。Nmalloc()memcpy()

若要将 new 返回给调用方,请将此参数作为指针传递。N

您需要先调用,然后再检查是否为 null。fopen()fp

要返回新的文件内容数组,您必须声明要返回的函数,而不是 。int *void

char *appendIntArray(char* filename, int* array, int *N){
    FILE* fp = fopen(filename, 'rb');
    if(!fp) {
        return NULL;
    }

    int currentsize;
    fread(&currentsize, sizeof(int), 1, fp);

    int* buffer = (int*) malloc(sizeof(int)*(currentsize + *N));
    if (!buffer) {
        return array;
    }

    fread(buffer, sizeof(int), currentsize, fp);
    fclose(fp);

    fp = fopen(filename, "wb");
    if (!fp) {
        return NULL;
    }

    memcpy(&buffer[currentsize], array, N * sizeof(int));
    *N += currentsize;
    fwrite(N, sizeof(int), 1, fp);
    fwrite(buffer, sizeof(int), *N, fp);
    fclose(fp);

    return buffer;
}