我必须添加一个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);
}
'谁能告诉我为什么我的程序崩溃并纠正我。
如果文件为空,则应该有一个数组。如果文件已经包含一个数组,我应该将两个数组连接起来。
在分配缓冲区之前,从文件中读取当前长度。将N
添加到其中以获得最终结果数组的大小,并在malloc()
中使用它。然后您可以使用memcpy()
将新数组复制到旧文件内容后面的缓冲区末尾。
要将新的N
返回给调用者,将此参数作为指针传递。
在检查fp
是否为空之前,需要调用fopen()
。
要返回新的文件内容数组,必须声明函数返回int *
,而不是void
。
char *appendIntArray(char* filename, int* array, int *N){
FILE* fp = fopen(filename, 'rb');
if(!fp) {
return NULL;
}
int currentsize;
fread(¤tsize, 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;
}