Stdio разработан, чтобы быть достаточно эффективным независимо от того, каким способом вы предпочитаете читать данные. Если вам нужно выполнять посимвольное чтение и запись, они обычно расширяются до макросов, которые просто получают доступ к буферу, кроме случаев, когда он заполнен / пуст. Для построчного текста io используйте puts
/ fputs
и fgets
. (Но НИКОГДА не используйте gets
, потому что нет способа контролировать, сколько байтов он будет читать!) Семейство printf
(например, fprintf
), конечно, чрезвычайно полезно для текста, поскольку оно позволяет вам перед записью пропустите создание временного буфера в памяти (и, таким образом, вы избежите размышлений обо всех проблемах с выделением памяти, переполнением и т. д.). fscanf
имеет тенденцию быть гораздо менее полезным, но в основном потому, что его трудно использовать. Если вы хорошо изучите документацию по fscanf
и научитесь использовать %[
, %n
и числовые спецификаторы, это может быть очень мощно!
Для больших блоков текста (например, загрузка всего файла в память) или двоичных данных вы также можете использовать функции fread
и fwrite
. Вы всегда должны передавать 1 для аргумента размера и количество байтов для чтения / записи для аргумента count; в противном случае из возвращаемого значения невозможно определить, сколько было успешно прочитано или записано.
Если вы работаете в достаточно POSIX-подобной системе (почти все), вы также можете использовать низкоуровневые функции io open
, read
, write
и т. Д. Это НЕ часть стандарта C, но часть систем POSIX, и системы, не относящиеся к POSIX, обычно предоставляют те же функции, но, возможно, с немного другим поведением (например, файловые дескрипторы не могут быть пронумерованы последовательно 0,1,2, ... как POSIX потребуется).