0

一連の数字 (1 行に 1 つ) で構成される C のファイルを解析しようとしています。各セットはカンマで区切ります。何らかの理由で、間違った出力が得られます。

入力例: 1,2,4,8,55,777 出力: メモリ アドレスと思われるものの束。そして、文字列を印刷すると、55または777(または2桁を超える数字)ではありません。

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

あなたが使用することができます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 に答える
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; (トークン != NULL) && ((set[i] = atoi(トークン)) != 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));」を実行すると、あなたは実際に1行を読みます。「set」をクリアしなかった場合、ゴミが含まれている可能性がある場合は、次の値を読み込む前に「printf()」します

于 2013-02-04T07:54:23.143 に答える