Есть ли способ прочитать из файла, не сохраняя информацию где-нибудь? - PullRequest
0 голосов
/ 31 января 2019

Есть ли способ чтения из файла без сохранения информации где-либо?

Если я использую fscanf(in, "%s %d", string, &number), я вынужден хранить %s в string и %d в number.Есть ли способ не сделать это?Мне нужно сканировать, потому что я хочу знать, сколько записей в этом файле.

Под «записями» я подразумеваю вхождения %s и %d.

1 Ответ

0 голосов
/ 31 января 2019

Оригинальная версия вопроса указана только "%s" в формате;он был обновлен и теперь запрашивает "%s %d" в качестве формата записи.

Странное требование во многих отношениях.Вы можете использовать подавление присваивания, но будьте осторожны, так как это ограничивает вашу проверку ошибок.Обратите внимание, что спецификация преобразования %s читает слова, разделенные пробелами - вероятно, именно это вы подразумеваете под «записями», поскольку именно эту функцию и формат вы используете.

size_t count = 0;
while (fscanf(in, "%*s") == 0)
    count++;

printf("There are %zu words in the input\n", count);

Вы можете использовать фиксированныйХраните так:

int offset = 0;
size_t count = 0;

while (fscanf(in, "%*s%n", &offset) == 0 && offset != 0)
{
    count++;
    offset = 0;
}

Страница справочника scanf() обеспечивает тщательное чтение, повторное чтение и повторное чтение.


Та же основная идея подавления присваивания применяется к формату записи "%s %d".Проблема в том, что подавленные преобразования не учитываются в возвращаемом значении от fscanf() - и спецификации преобразования %n также не учитываются.Таким образом, вы можете использовать:

int offset = 0;
size_t count = 0;

while (fscanf(in, "%*s %*d%n", &offset) == 0 && offset != 0)
{
    count++;
    offset = 0;
}

, что является лишь тривиальной модификацией того, что было раньше.Если преобразование %*s или %*d завершится неудачно, %n не будет выполнено, поэтому offset не изменится.Если оба успешны, тогда offset будет присвоено значение больше нуля (потому что строка должна содержать не менее одного символа, а число должно содержать не менее одного символа, и между строкой ичисло).Итак, показанный код определяет, было ли чтение успешным.

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