Присвоение целочисленных значений из файла массиву с помощью fgetc () - PullRequest
0 голосов
/ 28 июня 2019

Я хотел бы получить числовые значения из CSV-файла и сохранить их в массиве.Мою попытку можно увидеть здесь:

FILE *ifp;

ifp = fopen(DIREC,"r");
if(ifp == NULL){
        fprintf(stderr,"Input file not read.\n");
        exit(1);
    }

int rows = 0;
int columns = 0;

rows = readParts(ifp);
fseek(ifp, 0, SEEK_SET);
columns = readConfigs(ifp);
fseek(ifp, 0, SEEK_SET);
char arr[rows][columns];
arr[rows][columns] = malloc(sizeof(int)*rows*columns);

for (int i=0; i < rows; ++i){
        while(!feof(ifp)){
            int count = 0;
            int c = fgetc(ifp);

            if(c == '\n'){
                break;
            }
            if(isdigit(c)){
                arr[i][count] = c;
                count++;
            }
        }
    }
printf("First entry: %d", arr[0][0]);

fclose(ifp);

Однако у меня возникают проблемы с использованием fgetc() для чтения целочисленных значений.Я знаю, что это захват числа, поскольку printf("%c",c); возвращает правильные результаты.Однако при назначении c на arr я не назначаю правильное значение, так как fgetc() не возвращает фактическое значение символа.Я пробовал кастовать (int) c, но это ничего не изменило.Я изучил fnscanf(), но я не уверен, как это будет работать, так как мой файл .csv также содержит нечисловые значения.Есть ли правильный способ присвоить целочисленные значения массиву, используя fgetc()?

1 Ответ

1 голос
/ 28 июня 2019

У вас есть ряд проблем.Для начала:

rows = readParts(ifp);
fseek(ifp, 0, SEEK_SET);        /* rewinds to beginning */
columns = readConfigs(ifp);     /* re-reads rows values as columns */
fseek(ifp, 0, SEEK_SET);        /* rewinds to beginning -- again */

Избавьтесь от fseek(ifp, 0, SEEK_SET); вызовов, оставив только:

rows = readParts(ifp);
columns = readConfigs(ifp);

Далее:

char arr[rows][columns];

объявляет массив переменной длины , хранилище полностью зарезервировано, и выделение не требуется.Если вы хотите динамически распределить, вам нужно будет объявить rows количество указателей, а затем columns число int на указатель.(Вы также можете объявить указатель на VLA int (*)[columns], но, поскольку columns не является константой времени компиляции, это не рекомендуется).Удалите arr[rows][columns] = malloc(sizeof(int)*rows*columns);

Далее, чтобы прочитать файл в массив, просто сохраните правильные счетчики r (строка) и c (столбец), а затем прочитайте каждое целое число в файле с помощью fscanf (ifp, "%d", &arr[r][c]) (илииспользуйте fgets(), чтобы прочитать строку в буфере, а затем проанализировать значения из строки с помощью sscanf)

Например:

int r = 0, c = 0;

while (fscanf (ifp, "%d", &arr[r][c++]) == 1) {
    /* check if row full */
    if (c == columns) {
        r++;            /* advance row count  */
        if (r == rows)  /* protect arr bounds */
            break;
        c = 0;          /* reset column count zero */
    }
}

( примечание: Вы упомянули .csv, но не предоставили никаких примеров ввода из файла. Если файл на самом деле разделен запятой , вам нужно будет передвигать указатель чтения за запятой (или до '\n'или EOF найдено) после каждого целочисленного чтения в цикле)

В этот момент вы заполнили свой массив каждым целочисленным значением в файле, и вы сделали так, чтобы каждая сохраненная строка / столбецзначения остаются в пределах ваших arr.

Дайте мне знать, если у вас есть дополнительные вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...