Считать разделенный запятыми список чисел не удается - PullRequest
0 голосов
/ 20 октября 2018

У меня есть файл, содержащий список чисел, разделенных запятыми.Я пробовал разные методы чтения данных, и этот фрагмент кода работал без проблем на разных наборах данных.

Например, ввод (600 значений): https://pastebin.com/AHJ5UpEu

#include <stdio.h>
#include <stdint.h>
#include <malloc.h>
#include <mem.h>

#define READ "r"
#define MAX_LINE_SIZE 4096
#define DATA_DELIMITER ","


unsigned char *readInput(const char *filename, size_t inputs) {
    unsigned char *input = malloc(sizeof(unsigned char) * inputs);
    unsigned char nbr;
    const char *token;
    int i;

    FILE *inputPtr = fopen(filename, READ);
    char line[MAX_LINE_SIZE];

    while (fgets(line, MAX_LINE_SIZE, inputPtr)) {
        nbr = 0;
        for (token = strtok(line, DATA_DELIMITER); token && *token; token = strtok(NULL, ",\n")) {
            input[nbr] = (unsigned char) atoi(token);
            nbr++;
        }
        break;
    }

    fclose(inputPtr);

    if(nbr != inputs){
        printf("Error, did not read all files. Only read %d\n",nbr);
        exit(-1);
    }
    exit(0);
}

int main() {


    unsigned char *d = readInput("../traces/inputs.dat", 600);
    free(d);
    exit(0);
}

Хотя это толькочитает первые 88 значений.Если я изменю максимальный размер строки, например, на 512, то это число будет 145. Хотя значение должно - если я правильно понимаю - равным длине строки, в моем случае ~ 2100 символов.Таким образом, использование 4098 не должно быть проблемой.

Пожалуйста, исправьте меня, если я ошибаюсь.

Почему я не читаю не все 600 значений, а только части данных?

1 Ответ

0 голосов
/ 20 октября 2018

nbr используется как целочисленный счетчик, но определяется как символ без знака.Символ - это один байт, а неподписанный байт имеет диапазон от 0 до 255. Увеличение значения больше 255 приведет к переполнению байта и возврату к значению 0. Таким образом, в настоящее время nbr фактически является общим числом обработанных записей, мод 256.

...