2015-05-26 4 views
1

Мне было интересно, как читать данные из текстового файла, который имеет свои данные, разделенные запятой; например, строка 1 текстового файла говорит: (Name, Integer, Integer).Как читать данные, разделенные символом ',' в текстовом файле в C

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

while (fscanf(ifp, "%15s,%d,%d", stationName, &stationDistance, &stationDirection) == 2) { 
    strcpy(q[fileCounter].name, stationName); 
    q[fileCounter].distance = stationDistance; 
    q[fileCounter].direction = stationDirection; 
    printf ("Station Name: %s \t Distance to Central: %d \t Direction from Central: %d \n", q[fileCounter].name, q[fileCounter].distance, q[fileCounter].direction); 
    fileCounter++; 
} 

ответ

2

Если Name содержит пробелы, то спецификатор формата, который вы используете там остановится и не получится, вы бы нужно

while (fscanf(ifp, "%15[^,],%d,%d", 
      stationName, &stationDistance, &stationDirection) == 3) 
{ 
} 

[ спецификатор совпадает с набором символов, указать внутри [], например "%[0-9]" матчи все цифры от 0 до 9, символ ^ сообщает fscanf(), чтобы соответствовать тому, что не является символами, заключенными в [], и после ^, поэтому вы соответствуете чему-либо, кроме ,, который является тем, что вы хотите.

В отличии от "%15s" спецификатора поглощает все символы, появившиеся до 15 символов или белого символ пробела, как в isspace(chr) != 0 появился, поэтому я полагаю, что ваш fscanf() лишь соответствие два из трех значений.

Вы сравнивали возвращаемое значение fscanf() в 2 вместо 3 который я думаю потому, что он возвращался 2 вместо 3 и вы знали, что, поскольку в противном случае петля не была введена, а , что это на самом деле плохо для do, потому что вы вызываете неопределенное поведение, так как один из трех параметров не может быть инициализирован scanf(), вы копируете имя с strcpy() и сохраняете целые числа.

+0

Ничего себе, ты так многому научил меня, я даже не подозревал, что ты мог бы сделать что-нибудь из этого, спасибо тебе большое, но почему-то он не входит в цикл сейчас? – MattSolo

+0

Тогда вам понадобится отправить данные из входного файла. –

+0

Данные выглядят следующим образом: «Taren Point, 10, S» -> следующая строка «Ashfield, 6, W» – MattSolo

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