Подтвердить что ты не робот

Чтение чисел из текстового файла в массив в C

Я программирую noob, поэтому, пожалуйста, несите меня.

Я пытаюсь читать числа из текстового файла в массив. Текстовый файл "somenumbers.txt" просто содержит 16 номеров как "5623125698541159".

#include <stdio.h>
main()
{

    FILE *myFile;
    myFile = fopen("somenumbers.txt", "r");

    //read file into array
    int numberArray[16];
    int i;

    for (i = 0; i < 16; i++)
    {
        fscanf(myFile, "%d", &numberArray[i]);
    }

    for (i = 0; i < 16; i++)
    {
        printf("Number is: %d\n\n", numberArray[i]);
    }


}

Программа не работает. Он компилирует, но выводит:

Число: -104204697

Число: 0

Число: 4200704

Число: 2686672

Число: 2686728

Число: 2686916

Номер: 2004716757

Число: 1321049414

Число: -2

Номер: 2004619618

Номер: 2004966340

Число: 4200704

Число: 2686868

Число: 4200798

Число: 4200704

Число: 8727656

Возвращен процесс 20 (0x14) время выполнения: 0.118 с Нажмите любую клавишу, чтобы продолжить.

4b9b3361

Ответ 1

измените на

fscanf(myFile, "%1d", &numberArray[i]);

Ответ 2

5623125698541159 рассматривается как одно число (вне диапазона int для большинства архитектур). Вам нужно записать числа в вашем файле как

5 6 2 3 1 2 5  6 9 8 5 4 1 1 5 9  

для 16 чисел.

Если ваш файл имеет вход

5,6,2,3,1,2,5,6,9,8,5,4,1,1,5,9 

затем измените спецификатор %d в fscanf на %d,.

  fscanf(myFile, "%d,", &numberArray[i] );  

Вот ваш полный код после нескольких модификаций:

#include <stdio.h>
#include <stdlib.h>

int main(){

    FILE *myFile;
    myFile = fopen("somenumbers.txt", "r");

    //read file into array
    int numberArray[16];
    int i;

    if (myFile == NULL){
        printf("Error Reading File\n");
        exit (0);
    }

    for (i = 0; i < 16; i++){
        fscanf(myFile, "%d,", &numberArray[i] );
    }

    for (i = 0; i < 16; i++){
        printf("Number is: %d\n\n", numberArray[i]);
    }

    fclose(myFile);

    return 0;
}

Ответ 3

for (i = 0; i < 16; i++)
{
    fscanf(myFile, "%d", &numberArray[i]);
}

Это попытка прочитать всю строку "5623125698541159" в &numArray[0]. Вам нужны пробелы между цифрами:

5 6 2 3 ...

Ответ 4

Цикл с% c для чтения символа потока по символу вместо% d.

Ответ 5

В коде есть две проблемы:

  • необходимо проверить значение scanf необходимо.
  • преобразование %d не учитывает переполнения (слепо применяя *10 + newdigit для каждого последовательного числового символа)

Первое значение, которое вы получили (-104204697), равно 5623125698541159 по модулю 2^32; это, таким образом, результат переполнения (если int, где 64 бит в ширину, переполнение не произойдет). Следующие значения не инициализируются (мусор из стека) и, следовательно, непредсказуемы.

Необходимый код может быть похож на ответ BLUEPIXY выше, на иллюстрации, как проверить возвращаемое значение scanf, количество успешно совпадающих элементов):

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i, j;
    short unsigned digitArray[16];
    i = 0;
    while (
        i != sizeof(digitArray) / sizeof(digitArray[0])
     && 1 == scanf("%1hu", digitArray + i)
    ) {
        i++;
    }
    for (j = 0; j != i; j++) {
        printf("%hu\n", digitArray[j]);
    }
    return 0;
}

Ответ 6

Все это значения мусора, потому что они не могут найти местоположение вашего txt файла. Дайте полное местоположение, и код будет работать нормально.