C не ускладнює обробку тексту. Він прибирає шари абстракції та залишає вам «голу» механіку. Якщо ви вивчали документацію C, то, ймовірно, помітили, що всі функції введення/виведення тексту знаходяться в бібліотеці stdio. Це абревіатура від Standard Input/Output (стандартне введення/виведення). Саме вона є фундаментом взаємодії програм на C із зовнішнім світом.

Більшість початківців починають роботу з stdin і stdout. Це стандартні потоки. Вони позначають, звідки програма отримує дані та куди надсилає результати. Якщо ваша програма потребує лише одного джерела введення та одного приймача виводу, вам не потрібна складна робота з файлами. Ви просто передаєте дані через командний рядок.

Шість базових потоків

Заголовок stdio надає шість конкретних команд взаємодії з цими потоками. Вони прості. Прямі.

  • printf : Записує відформатований текст у stdout.
  • scanf : Читає відформатовані дані з stdin.
  • puts : Виводить рядок на екран.
  • gets : Читає рядок тексту з клавіатури.
  • putc : Записує один символ у stdout.
  • getc або getchar : Читає один символ із stdin.

Навіщо їх використати? Тому що їх можна перенаправляти. Тут проявляється сила C. Вам не потрібно змінювати код, щоб читати дані із файлу замість клавіатури. Ви просто змінюєте команду, яку ви вводите в терміналі.

Простий підрахунок символів

Розглянемо практичний приклад. Уявіть, що вам потрібна програма, яка підраховує загальну кількість символів у тексті, що вводиться. Ось код:

`

Цей код очікує на введення. Ви вводите рядки. Коли закінчите, натисніть CTRL-D. Це сигналізує про кінець файлу (eof ). Функція gets повертає нуль під час досягнення кінця файлу, що перериває цикл. Підсумковий підрахунок відображається на екрані.

Але ось у чому хитрість. Вам не довелося редагувати код, щоб підрахувати символи у файлі. Ви просто додали невелику інструкцію до оболонки (shell).

Перенаправлення введення та виведення

Якщо ви скомпілювали цю програму в файл, що виконується, з ім’ям xxx, ви можете передати їй файл.

`

Куточкова дужка перенаправляє вміст filename у stdin. Програма вважає, що читає з клавіатури. Насправді, вона читає з диска.

Ви також можете використати конвеєри (pipes). Це передає виведення однієї команди безпосередньо до іншої.

`

Результат той самий. Команда cat виводить вміст файлу на стандартний висновок. Конвеєр передає його вашій програмі.

Ви також можете перенаправити висновок. Замість того, щоб бачити підрахунок на екрані, ви можете зберегти його.

`

Тепер xxx читає з filename та записує результат у новий текстовий файл з ім’ям out. Це сильна можливість. Вона дозволяє зв’язувати інструменти разом без написання додаткового коду обробки файлових покажчиків.

Коли потоків недостатньо

Іноді перенаправлення недостатньо. Можливо, вам потрібно відкрити декілька файлів одночасно. Можливо, ви створюєте текстовий редактор, який зберігає конфігураційні файли. Можливо, вам потрібно перевірити, чи ви досягли кінця файлу, не викликаючи збоїв.

У таких випадках вам потрібні функції прямої роботи з файлами. Вони також знаходяться в stdio, але працюють із файловими покажчиками, а не зі стандартними потоками.

  • fopen : Відкриває файл для читання чи запису.
  • fclose : Закриває файл, коли робота з ним завершена.
  • feof : Перевіряє, чи кінець файлу досягнуто.
  • fprintf : записує відформатовані дані у конкретний файл.
  • fscanf : Читає відформатовані дані з файлу.
  • fputs : записує рядок у файл.
  • fgets : Читає рядок із файлу.
  • fputc : Записує символ у файл.
  • fgetc : Читає символ із файлу.

Ці функції дають вам більше контролю. Ви можете керувати кількома потоками одночасно. Ви можете точно вирішити, які дані до якого файлу записуються.

Який шлях ви оберете? Простоту перенаправлення stdin чи контроль прямих файлових покажчиків? Це залежить від того, що ви створюєте. Для швидких скриптів перенаправлення – король. Для складних програм вам знадобляться функції роботи з файлами.

Ідеальної відповіді немає. Є лише компроміси.