2015-09-30 2 views
1

Я хочу читать Int из файлаКак использовать fscanf, заботиться о endofline?

Первая строка состоит из 1 междунар и второй 2

т.е.

1 
2 3 

если я сделать

fscanf(FILE, "%d \n %d %d", &a, &b, &c); 

I правильно введите 3 цифры , но если я поместил все цифры в одну строку в файл т.е. 1 2 3

я получить тот же результат (и это не то, что я хочу)

Я хочу знать: Как заставить пользователя перейти на новую строку в его файле?

Edit: Как представляется неясным, некоторые (я прошу прощения за то, что) я хочу, что файл

1 
2 3 

Производят результат:

a = 1 
b = 2 
c = 3 

И файл

1 2 3 

Произвести либо ошибку, либо

a = 1 
b = 0 
c = 0 
+0

Непонятно, что вы хотите. – ameyCU

+0

Вы здесь неясны. Если вы читаете данные из файла, который является символом новой строки '\ n', вам нужен цикл, который может вызывать fgets(), если в файле нет двоичных данных. Отправьте остальную часть своей программы, чтобы мы могли получить представление о конечной цели здесь. – Dave

+0

'int a, b, c; char temp [2]; if (fscanf (FILE, "% d% c% d% c% d", & a, & temp [0], & b, & temp [1], & c)! = 5 || temp [0]! = '\ n' || temp [1]! = '') {/ * Недопустимый формат данных в файле * /} ' –

ответ

2

fscanf(FILE, "%d", ...); сначала сканирует и отбрасывает пробел перед сканированием на int символов. При сканировании белого пространства оба ' ' и '\n' обрабатываются одинаково, поэтому использование '%d' теряет конец линии.

fscanf(FILE, "\n", ...); и fscanf(FILE, " ", ...); сделать то же самое: сканирование и отбросить любой белого пространства. Использование «\ n» делает не сканирование только для '\n'.

код может использовать fscanf(FILE, "%d%*1[\n]%d %d", &a, &b, &c) == 3, чтобы найти '\n' после a, но дополнительный '\n' может скрываться в других местах.

Единственный способ использования scanf() семьи обнаруживать '\n' предполагает использование '%c' или '%[]' или '%n'. Легче использовать fgets(), а затем проанализировать с помощью sscanf() или strtol().

int Read1and2int(FILE *stream, int *a, int *b, int *c) { 
    char buf[100]; 
    int n; 

    if (fgets(buf, sizeof buf, stream) == NULL) return EOF; 
    int count = sscanf(buf,"%d %n", a, &n); 
    // Non-numeric or extra data 
    if (count != 1 || buf[n]) return 0; 

    if (fgets(buf, sizeof buf, stream) == NULL) return 1; 
    count = sscanf(buf,"%d%d %n", b, c, &n); 
    // Non-numeric or extra data 
    if (count != 2 || buf[n]) return 1; 
    return 3; 
} 
3

Вы должны прочитать каждую строку в буфере символов, используя fgets, и проанализировать каждую строку со своим собственным sscanf. Вы можете использовать дополнительный %s в конце строки формата (и дополнительный аргумент указателя на фиктивную переменную типа char *), чтобы определить, содержит ли строка дополнительные материалы после полей, которые вы ищете.

+0

Я никогда не выяснял, почему люди продолжают преподавать [f] scanf, который после ошибки оставляет входной поток в практически неизвестном состоянии. fgets и sscanf - это способ отделить чтение от разбора. – msw

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