Разница между fgets и fscanf?
у меня есть вопрос относительно fgets и fscanf в C. В чем именно разница между этими двумя? Например:
char str[10];
while(fgets(str,10,ptr))
{
counter++;
...
и второй пример:
char str[10];
while(fscanf(ptr,"%s",str))
{
counter++;
...
при наличии текстового файла, содержащего строки, разделенные пустым пространством, например: AB1234 AC5423 AS1433. В первом примере "счетчик" в цикле while не будет давать тот же результат, что и во втором примере. При изменении "10" в функции fgets счетчик будет всегда дают разные результаты. В чем причина этого? Может кто-нибудь также объяснить, что именно делает fscanf, как долго строка в каждом цикле while?
4 ответов
функции fgets
читать до новой строки (а также сохраняет ее). fscanf
С %s
спецификатор читает до тех пор, пока пустое пространство и не сохраняет его...
в качестве примечания вы не указываете размер буфера в scanf, и это небезопасно. Попробуйте:
fscanf(ptr, "%9s", str)
в вашем примере fgets
будет считывать не более 9 символов из входного потока и сохранять их в str
, вместе с Терминатором 0. Он не будет пропускать пробелы. Он остановится, если увидит новую строку (которая будет сохранена в str
) или EOF перед максимальным количеством символов.
fscanf
С %s
спецификатор преобразования пропустит все ведущие пробелы, а затем прочитает все символы без пробелов, сохраняя их в str
последовала 0 терминатор. Он прекратит чтение при следующем символе пробела или EOF. Без явной ширины поля он будет читать столько символов без пробелов, сколько есть в потоке, потенциально переполняя целевой буфер.
Итак, представьте, что входной поток выглядит следующим образом:"\t abcdef\n<EOF>"
. Если вы использовали fgets
читать его, str
содержит "\t abcdef\n"
. Если вы использовалиfscanf
, str
может содержать "abcdef"
(где указывает на 0 Терминатор).
fgets
читать весь линию. fscanf
С %s
прочитайте строку, разделенную пробелом (или \n,\t и т. д...).
В любом случае, вы не должны использовать их, если не уверены, что массив, который Вы читаете, достаточно велик, чтобы содержать входные данные.
Ты написал When changing the "10" in the fgets function the counter will always give different results.
обратите внимание, что fgets и scanf не знают, сколько байтов читать. ты должен сказать им. изменение "10" просто увеличивает буфер, в который записываются эти функции.