C: чтение целых из файла и сохранение в массиве указателей - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь прочитать целые числа из файла и сохранить их в массиве.Затем я хочу записать эти значения в другой файл.Чтение записи производится в отдельном файле из основного файла, где был создан массив.Я не могу изменить аргументы функции (это для присваивания, поэтому аргумент массива должен быть int ** ppPerm).Вызывается функция и изначально созданный массив в основной функции другого файла.Файл, из которого я читаю, выглядит следующим образом:

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

Где 15 - количество цифр.Таким образом, хронологический порядок функций:

Массив Perm создается в основной функции основного файла (int * Perm = NULL).Передается в readP ()

readP(In, &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 голосов
/ 26 сентября 2018

Не разыгрывайте результат calloc() или malloc() в C!Он может скрывать ошибки.

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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...