所以我从文本文件加载浮点行并将它们存储在指针数组中,然后将它们保存回文本文件并添加对它们大小的引用。文本文件中的值的数量不同,因此数组必须是动态的。我像这样在main中定义我的指针数组。
size_t size = (int)100 * sizeof(float);
float * val = malloc(size);
然后我将指针数组传递给一个加载文本文件并将值保存到它的函数,就像这样。
//Read file into array.
int readFile(float *val, int size) {
char buf[20] = { 0 };
val[0] = 0;
double temp = 0;
int i = 1;
FILE *file;
file = fopen("C:\\Users\\MoldOffice\\Dropbox\\VS\\finalproj\\ecgproject\\dataStream", "r");
if (!file) {
printf("Coulding find file.\n");
exit(1);
}
while (fgets(buf, 20, file) != NULL) {
temp = atof(buf);
if (temp != 0) {
// Increment i to find the size of the useful data.
val[i] = temp;
//printf("%d",val[i]);
i++;
if (i == size / sizeof(float)) {
size += 100*sizeof(float);
double* val_temp = realloc(val, size);
if (val_temp == NULL) {
printf("Realloc failed.\n");
}
else {
val = val_temp;
}
}
}
}
//Test that the array is readable.
for (int i = 0; i < 5; i++) printf("val[%d]=%f\n", i, val[i]);
return(i);
fclose(file);
这很好用,当我在main中打印指针数组的内容时,它可以正常工作。然后我将相同的指针数组传递给另一个将数组保存在新文本文件中的函数,以及第一行的大小,问题是当我第二次传递指针数组时,内容发生了变化(主要是0有一些随机数)。我完全不知道为什么会发生这种情况..有什么想法吗?写入文件的函数在这里:
// Write file into array.
void writeFile(float *val,int size) {
printf("%d",sizeof(val));
FILE *file;
int sampleNum;
char buf[10];
file = fopen("sampleNum.txt", "r");
if (file == NULL) { sampleNum = 0; }
else { fscanf(file, "%d", &sampleNum); printf("%d",sampleNum);}
char fileString[10];
sprintf(fileString,"sample%d\0", sampleNum);
file = fopen(fileString, "w");
//Test that the array is readable.
for (int i = 0; i < 5; i++) printf("val[%d]=%f\n", i, val[i]);
//Print the array to a text file and save.
fprintf(file, "%d\n", size);
for (int i = 1; i < size; i++) {
fprintf(file, "%f\n", val[i]);
printf("%f\n", val[i]); }
fclose(file);
}
主要的其余部分可以在这里找到:
int main() {
size_t size = (int)100 * sizeof(float);
float * val = malloc(size);
// Read the data into an array.
int arraySize = readFile(val, size);
//Test that the array is readable.
for (int i = 0; i < 5; i++) printf("val[%d]=%f\n", i, val[i]);
// Save the array to a text file, with the size of the array as the first element.
writeFile(val,arraySize);
}
答案 0 :(得分:3)
double* val_temp = realloc(val, size);
if (val_temp == NULL) {
printf("Realloc failed.\n");
}
else {
val = val_temp;
此函数的调用者无法知道您已将数组移动到其他位置。它仍然是旧的,现在无效的指针。
您与size
存在类似问题。调用者如何知道你改变了它?
你选择的责任分工很差。如果调用者负责分配缓冲区,则此函数应该要求调用者放大它。如果此函数负责分配缓冲区,则应分配缓冲区。分担管理大块内存分配的责任通常是一个非常糟糕的主意,这显示了其中一个原因。
也许传入指向包含指向缓冲区及其大小的指针的结构的指针?这样可行,但仍显示责任分工不佳。
也许让这个函数分配缓冲区并返回一个结构,该结构包含一个指向它的指针和它中元素的数量?
如果你真的想以这种方式做事,可以考虑将函数指针传递给一个结构,该结构包括一个指向数组的指针,数组的大小以及一个指向调整数组大小的函数的指针。当然,调用者可以将此指针设置为指向realloc
函数(尽管它可能更好地成为更改结构的指针和大小成员的函数)。
你也可以使用这样的代码:
struct float_buffer
{
float* buffer;
int size;
};
struct float_buffer allocate_float_buffer(int size)
{
struct float_buffer buf;
buf.buffer = malloc (size * sizeof(float));
buf.size = size;
return buf;
}
bool resize_float_buffer(struct float_buffer* buf, int size)
{
float* tmp = realloc(buf->buffer, size * sizeof(float));
if (tmp == NULL)
return false;
buf->buffer = tmp;
buf->size = size;
return true;
}
然后传递函数a struct float_buffer *
。