Что означает 2 в этой строке fscanf (fi, "% d% d", & used, "a) == 2? - PullRequest
0 голосов
/ 21 сентября 2019

Я начал изучать файлы, и я не совсем понимаю, как они читаются.

  1. Мой первый вопрос: что означает 2 в этой строке?

    fscanf(fi,"%d %d", &used,&quota) == 2
    

    Разве это не должно быть равно EOF, как оно поймет, чтопрограмма достигла конца?

  2. Чем файл с данными в одной строке отличается от файла с данными в нескольких строках.Как он читает \ n и как я могу прочитать только первую строку или секунду, например?

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Чем файл с данными в одну строку отличается от файла с данными в несколько строк.Как он читает \ n и как я могу прочитать только первую строку или секунду, например?

Это еще один забавный факт о семействе scanf.Учитывая вызов

fscanf(fi, "%d %d", &used, &quota)

и строку ввода

10 20

, он успешно прочитает 10 для used и 20 для quota, что, вероятно, было то, что вы имели в виду.Но если бы вы дали ему ввод

10
20

, он также с радостью прочитал бы 10 для used и 20 для quota.На самом деле это будет работать так же хорошо для ввода

10

20

с пустой строкой там.Более того, у вас нет абсолютно никакого способа (то есть автора кода, который вызывает fscanf) определить, был ли ввод одной строкой или двумя строками, или что.

СледуетРазве это не равно EOF, как он поймет, что программа достигла конца?

Это правда: если fscanf достигает конца файла перед преобразованием любого ввода, он возвращает EOF, и это то, что вы хотели бы знать.Но это не единственное условие ошибки, о котором вы, возможно, захотите знать.

Предположим, что в строке ввода указано

10 abc 20

В этом случае вызов fscanf вернет 1, указывая, чтосмог прочитать значение 10 для used, но не смог ничего прочитать для quota.

Причина для проверки на 2 (как в коде, который вы спрашивали) заключается в том, что толькоесли fscanf возвращает 2, прочитал ли он и преобразовал значение для обеих переменных.

1 голос
/ 21 сентября 2019

Взгляните на страницу руководства для fscanf:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

После успешного завершения эти функции должны вернутьколичество успешно сопоставленных и назначенных элементов ввода ;это число может быть равно нулю в случае неудачного раннего сопоставления.

Таким образом, в этом случае проверка fscanf(fi,"%d %d", &used,&quota) == 2 должна убедиться, что и used, и quota были правильно прочитаны изфайл.


Если он не равен EOF, как он поймет, что программа достигла конца?

Ну да, только вэтот случай, хотяОпять же, со страницы руководства:

Если ввод заканчивается до того, как завершено первое преобразование (если оно есть), и при отсутствии соответствующего сбоя, возвращается EOF.


Чем файл с данными в одной строке отличается от файла с данными в нескольких строках.Как он читает \ n и как я могу прочитать только первую или вторую строку, например?

Когда вы вставите пробел (как здесь "%d %d") в строку формата, fscanf будетSkipp все пробелы, которые он встречает (включая пробелы, \n и другие символы).Это означает, что если вы введете 1 2 или 1 2 или 1\n2, все три ввода будут прочитаны без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...