2015-05-06 3 views
0

Входной текстовый файл имеет несколько номеров в строке, цифры разделяются пробелом. Первые две строки получили только одно число, а следующие строки получили три. Я хочу прочитать каждую строку ввода и сохранить эти числа.как читать текстовый файл в c, а затем разделить каждую строку на токены?

Это то, что я получил до сих пор:

int 
    main(int argc, char *argv[]) { 
     int n = 0; 
     char buff[MAX_STRING_LEN]; //MAX_STRING_LEN is defined as 64 
     while (fgets(buff,MAX_STRING_LEN, stdin) != NULL) { 
      char temp; 
      if (n == 0) { 
       sscanf(buff, "%s", &temp); 
       int h_num = (int)temp; 
      } else if (n == 1) { 
       sscanf(buff, "%s", &temp); 
       int s_num = (int)temp; 
      } else { 
       sscanf(buff, "%s", &temp); 
       char *token; 
       token = strtok(&temp, " "); 
       int i = 0; 
       int a,b,c; 
       while (token != NULL) { 
        if (i == 0) { 
         a = (int)token; 
         token = strtok(NULL, " "); 
        } else if (i == 1) { 
         b = (int)token; 
         token = strtok(NULL, " "); 
        } else { 
         c = (int)token; 
         token = strtok(NULL, " "); 
        } 
        i++; 
       } 
      } 
      n++; 
     } 
     return 0; 
    } 

Заявление для печати Я использовал, чтобы проверить свой код, как:

printf("%d\n",h_num); 
    printf("%d\n%d\n%d\n",a,b,c); 

Я создал текстовый файл, как это:

23 
34 
4 76 91 

но результат не тот, который я ожидал, это адрес указателя, который я думаю. (Я застрял с указателем снова =() Может кто-то помочь мне указать на то, что проблема? Цените это.

+2

Почему вы не используете 'fscanf (fp,"% d ", & num)'? –

+0

Было бы достаточно трех вызовов 'fscanf' с правильной строкой формата. Никаких петель, нет 'strtok', ничего сложного. –

+1

У вашего кода много проблем. 'sscanf (buff,"% s ", &temp);' пытается сканировать строку в 'char', используя токен' a = (int); 'и т. д. –

ответ

0

В вашем коде, я могу видеть,

int h_num = (int)temp; 

и

int s_num = (int)temp; 

нет, это не то, как вы преобразовать aphanumeric к снабжать струной, тетивой и т.п. int.

вы должны использовать strtol() для этой цели.

Затем

sscanf(buff, "%s", &temp); 

неправильно. temp - char, для этого вам нужно использовать %c.

Мое предложение для лучшего подхода:

  1. Читать полную строку из файла, используя fgets()
  2. разметить вход с использованием strtok(), используя пространство () как разделитель, а затем преобразовать маркер (если не NULL) до int с использованием strtol()
  3. продолжать до тех пор, пока возвращенный токен не будет

В этом случае ваш код будет гораздо более родовое, так как не нужно беспокоиться о отдельно числа из int сек, присутствующего в каждой строке.

+0

' strtol() 'почему не' atoi'? – Eregrith

+0

@Eregrith 'strtol()' более надежный , и может различаться между допустимым значением «0» и ошибкой. –

+0

Nice :) спасибо! – Eregrith

Смежные вопросы