2016-01-26 2 views
0

Я пытаюсь прочитать файл, который выглядит следующим образом:не fscanf соответствие правильно

truck, wanted, 4000 
truck, for sale, 2000 
microwave, for sale, 2 
truck, wanted, 4000 

но мой fscanf возвращается 1 (должно быть 3):

fscanf(file, 
     "%s, %[^,], %d", 
     items[i].type, 
     temp, 
     &items[i].price) 

В основном я хочу прочитать его как CSV, первое слово в первое var, второе слово (или wanted или for sale) в temp, а число - в третий var.

ответ

4

fscanf не работает подобный. Когда вы указываете спецификатор формата %s, он читает все до следующего пробела (или конца ввода). Это означает, что ваш первый %s будет читать truck,, то есть включать запятую в строку, которую он читает. %s не волнует, что в вашей строке формата вы разместили , после %s и, таким образом, «запросили» запятую, чтобы ее не прочитали. fscanf не поддерживает такие запросы. fscanf не имеет каких-либо расширенных возможностей поиска или соответствия шаблону. Он слепо читает столько, сколько запрошено текущим спецификатором формата. %s читает до следующего пробела - это все, о чем он заботится.

Если вы хотите прочитать это как значения CSV, вам необходимо вручную направлять fscanf на каждом шагу. В этом случае вы можете использовать %[^,] для всех строковых значений. Нечто подобное могло бы работать

fscanf(file, 
     "%[^,], %[^,], %d", 
     items[i].type, 
     temp, 
     &items[i].price) 

Если вы хотите, чтобы пропустить все ведущие пробелы, вы можете использовать формат " %[^,], %[^,], %d".

Пространство до %d может быть опущено, что означает, что "%[^,], %[^,],%d" - это то же самое, что и "%[^,], %[^,], %d".

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