0

我正在尝试解析 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

4 回答 4

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) && ((set[i] = atoi(token)) != 0); i++) {

于 2013-02-04T09:14:07.343 回答
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]); 
}
于 2013-02-04T07:54:11.600 回答
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));” 你实际上读了一行。如果你没有清除“set”,如果可能包含垃圾,你在读取下一个值之前“printf()”

于 2013-02-04T07:54:23.143 回答
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) {....}
于 2013-02-04T08:15:15.930 回答