读取逗号分隔的数字列表失败C

时间:2018-10-20 19:19:21

标签: c fopen

我有一个文件,其中包含用逗号分隔的数字列表。我尝试了不同的读取数据的方法,并且这段代码在不同的数据集上也没有问题。

例如输入(600个值):Popen.communicate

#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 :(得分:2)

nbr 的使用类似于整数计数器,但定义为无符号字符。一个char是一个字节,一个无符号字节的范围是0到255。递增到255以上将导致该字节溢出并返回值为0。因此,当前,nbr实际上是mod 256处理的条目总数。