fscanf в C - как определить запятую? - PullRequest
0 голосов
/ 30 марта 2011

Я читаю набор чисел из файла с помощью fscanf (), для каждого числа я хочу поместить его в массив.Проблема состоит в том, что эти числа разделены символом ",", как определить, что fscanf должен прочитать несколько шифров, и когда он найдет "," в файле, он сохранит его как целое число?Спасибо

Ответы [ 4 ]

4 голосов
/ 30 марта 2011

Это может быть начало:

#include <stdio.h>

int main() {
    int i = 0;

    FILE *fin = fopen("test.txt", "r");

    while (fscanf(fin, "%i,", &i) > 0)
        printf("%i\n", i);

    fclose(fin);

    return 0;
}

С этим входным файлом:

1,2,3,4,5,6,
7,8,9,10,11,12,13,

... вывод такой:

1
2
3
4
5
6
7
8
9
10
11
12
13

Чточто конкретно вы хотите сделать?

2 голосов
/ 30 марта 2011

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

while (fscanf(file, "%d%*[, \t\n]", &numbers[i++]))
    ;

% d преобразует число, а "% * [, \ t \ n]" читает (но не назначает) любой последовательный прогон разделителей - который я определил как запятые, пробелы, табуляции, переводы строк хотя это довольно тривиально, чтобы перейти на то, что вы считаете нужным.

0 голосов
/ 16 июля 2018

Ответ Джерри Коффина хорош, хотя есть несколько предостережений, на которые стоит обратить внимание:

  1. fscanf возвращает (отрицательное) значение в конце файла, поэтому цикл не завершится должным образом.

  2. i увеличивается, даже когда ничего не читается, поэтому он в конечном итоге будет указывать один за концом данных.

  3. Кроме того, fscanf пропускает все пробелы (включая \t и \n, если вы оставляете пробел между параметрами формата.

Я бы пошел на что-то вроде этого.

int numbers[5000];
int i=0;
while (fscanf(file, "%d %*[,] ", &numbers[i])>0 && i<sizeof(numbers))
{
    i++;
}
printf("%d numbers were read.\n", i);

Или, если вы хотите применить запятую между числами, вы можете заменить строку формата на "%d , ".

0 голосов
/ 30 марта 2011

fscanf(file, "%d,%d,%d,%d", &n1, &n2, &n3, &n4);, но не будет работать, если между числами есть пробелы. Этот ответ показывает, как это сделать (поскольку для этого нет библиотечных функций)

...