Когда/почему это - плохая идея использовать fscanf () функция?

Это должно сработать. Обратите внимание, что вы должны использовать T при ссылке на тип и any при ссылке на значение Class<?>, требуемое для createQuery и других методов.

private <T> void selectAllFrom(Class<T> any) {
    CriteriaQuery<T> query = builder.createQuery(any)
}
6
задан Community 23 May 2017 в 12:15
поделиться

5 ответов

Imagine a file with three lines:

   1
   2b
   c

Using fscanf() to read integers, the first line would read fine but on the second line fscanf() would leave you at the 'b', not sure what to do from there. You would need some mechanism to move past the garbage input to see the third line.

If you do a fgets() and sscanf(), you can guarantee that your file pointer moves a line at a time, which is a little easier to deal with. In general, you should still be looking at the whole string to report any odd characters in it.

I prefer the latter approach myself, although I wouldn't agree with the statement that "it's almost always a bad idea to use fscanf()"... fscanf() is perfectly fine for most things.

13
ответ дан 8 December 2019 в 05:57
поделиться

Случай, когда это вступает в игру, - это когда вы сопоставляете символьные литералы. Предположим, у вас есть:

int n = fscanf(fp, "%d,%d", &i1, &i2);

Рассмотрим два возможных входа: « 323, A424 » и « 323A424 ».

В обоих случаях fscanf () вернет 1, и следующим считываемым символом будет 'A' . Невозможно определить, совпала ли запятая или нет.

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

4
ответ дан 8 December 2019 в 05:57
поделиться

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

2
ответ дан 8 December 2019 в 05:57
поделиться

Практически всегда использовать функцию fscanf () - плохая идея, поскольку она может оставить указатель файла в неизвестном месте в случае ошибки. Я предпочитаю использовать fgets () для ввода каждой строки, а затем sscanf () , что.

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

1
ответ дан 8 December 2019 в 05:57
поделиться

По сути, невозможно указать, что функция , а не выходит за пределы выделенной для нее области памяти.

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

0
ответ дан 8 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: