用C解析逗号分隔文件

时间:2013-02-04 07:38:18

标签: c parsing

我正在尝试解析C中的文件,该文件由一组数字组成(每行一个)。每组用逗号分隔。出于某种原因,我的输出结果不正确。

示例输入:1,2,4,8,55,777 输出:一堆似乎是内存地址的东西。当我打印掉字符串时,它不会读取55或777(或任何超过两位数的数字)。

int * parseFile(char *input, int *set, int line)
{
    char buf[BUF_SIZE];
    char *token = (char *) malloc(10 * sizeof(char));
    int i;

    FILE *f = fopen(input, "r");

    for (i = 1; i < line; i++)
        fgets(buf, BUF_SIZE, f);

    memset(buf, 0, BUF_SIZE); // Clear the buffer.
    i = 0;

    if (fgets(buf, BUF_SIZE, f) != NULL) {
        token = strtok(buf, ",");
        set[i] = atoi(token);
        i++;

       while (set[i] != 0) {
            printf("%d\n", set[i]);
            set[i] = atoi(token);
            i++;

            token = strtok(NULL, ",");
        }
    }

    fclose(f);

    return set;
}

4 个答案:

答案 0 :(得分:0)

在为其分配atoi的值之前,您正在打印set [i]的值。 考虑:

set[i] = atoi(token);
printf("%d,",set[i]); 

while (set[i] != 0) {
    i++;
    set[i] = atoi(token);
    printf("%d,",set[i]); 
}

答案 1 :(得分:0)

我对此非常困惑:

set[i] = atoi(token); //i = 0
i++; //i = 1

while (set[i] != 0) { //set[1] = ???
  printf(...set[i]); 
  set[i] = atoi(token);
  i++;
  ...

所以,根据数组“set”的先前内容,您决定是否读取下一个值。所以,如果你做了一个“memset(set,0,sizeof(set));”你真的读了一行。如果你没有清除“设置”,如果你可能包含垃圾,你在读取下一个值之前“printf()”

答案 2 :(得分:0)

您可以使用fscanf()

将以下fscanf()用于循环,直至到达文件末尾:

int a,b,c,d,e,x;
while (fscanf(f, " %d , %d , %d , %d, %d , %d", &a, &b, &c, &d, &e, &x) != EOF) {....}

答案 3 :(得分:0)

我喜欢这个

 if (fgets(buf, BUF_SIZE, f) != NULL) {
    token = strtok(buf, ",");
    for (i=0; token != NULL; i++) {
      set[i] = atoi(token);
      // Optional: if (set[i] == 0) break; // I don't know why to stop on 0
      printf("%d\n", set[i]);
      token = strtok(NULL, ",");
    }
  }

休息有点难看,但它比

更好

for(i = 0;(token!= NULL)&amp;&amp;((set [i] = atoi(token))!= 0); i ++){