C:从文件读取int并存储在指针数组中

时间:2018-09-26 20:20:51

标签: c arrays file

我正在尝试从文件中读取整数并将其存储在数组中。然后,我想将这些值写入另一个文件。读取写作是在与创建数组的主文件不同的文件中进行的。我无法更改函数的参数(这是分配的,因此数组参数必须为int ** ppPerm)。该函数在另一个文件的主函数中被调用,并且最初创建了数组。我正在读取的文件如下所示:

15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

15是多少个数字。因此,功能的时间顺序为:

Array Perm在主文件的主函数中创建(int * Perm = NULL)。它被传递到readP()

readP(In, &Perm);

读取文件中的数字并将其存储在Perm中。然后将相同的变量Perm传递到writeP()。

writeP(Out, Perm, permLength);

Perm被读取并写入另一个文件。 我不能更改任何一条线。沿路的某个地方将阵列弄坏了。这是readP()。

int readP(FILE* In, int** ppPerm) {
   int numElements = 0;

   fscanf(In, "%d", &numElements);

   *ppPerm = (int*)calloc(numElements, sizeof(int));

   int i;
   for (i = 0; i < numElements; i++) {
       fscanf(In, "%p", &ppPerm[i]);
   }

   return numElements;
}

现在,该数组完全不可读。无论出于何种原因,存储的数字都类似于0x0,然后是十六进制的随机混杂。然后在writeP()中使用该数组将值写入另一个文件:

void writeP(FILE* Out, const int* pPerm, int permLength) {

    int i = 2;
    for (i = 0; i < permLength; i++) {
        fprintf(Out, "%d ", pPerm[i]);
    }

    return;
}

int * pPerm是传递给readP()的同一数组。出于某种原因,通过调试,我发现pPerm包含的值与ppPerm完全不同,在某些情况下,它似乎是空的。我的功能到底出了什么问题?为什么不能将数字正确存储在数组中?为什么数组在readP()和writeP()之间不断混乱?

1 个答案:

答案 0 :(得分:0)

不要在C中强制转换calloc()malloc()的结果!它可以隐藏错误。

int i;
for (i = 0; i < numElements; i++) {
    fscanf(In, "%p", &ppPerm[i]);
}

由于要读取整数,因此格式字符串应为"%i""%d"。要访问指向已分配内存的指针,请使用*ppPerm

size_t i;  // variables that hold an index into or the size
           // of objects in memory should be of type size_t.
for (i = 0; i < numElements; i++) {
    fscanf(In, "%p", &(*ppPerm)[i]);
}