Пусть описан символьный массив

сhar string [80]; /* string – указатель на начало массива */.

Можно описать также указатель вида

сhar *string;

Однако, для того чтобы он мог указывать на строку, ей необходимо выделить место в динамической памяти:

string = (char*)malloc (80);

Стандартные функции gets(string) и puts (string) выполняют ввод строки с клавиатуры (stdin) и вывод на экран (stdout).

Файловые аналоги fgets (m, string, fp) и fputs (string, fp) работают с произвольными открытыми файлами fp, причем параметр m – это допустимое число байтов ввода. Однако есть отличия в работе стандартных и файловых функций.

Функция gets() завершает прием символов при получении символа ‘\n’ (нажатие клавиши Enter), который заменяется нуль-байтом (‘\0’).

Функция fgets() не делает такого преобразования. Она, встретив символ ‘\n’ в файле, передает его в строку, после чего записывается последний символ строки (‘\0’). Если предпоследний символ не ‘\n’, значит прочитано предельное число символов m.

Функция fgets () для приема строк со стандартного ввода (stdin) более безопасна, так как она ограничивает число принимаемых символов величиной m.

При выполнении функции puts() символ ‘\0’ (конец строки) преобразуется в ‘\n’. Функция fputs() не делает такого преобразования, а просто отбрасывает ‘\0’. Следовательно, если строки принимаются из файла функцией fgets(), а выводятся на экран функцией puts() происходит удвоение в файле stdout символа ‘\n’, что добавляет чистые строки между текстовыми строками на экране. Это нетрудно проверить, заменив в примере нижеследующей программы функцию fputs (string, stdout) на puts (string).

Пример. Демонстрация использования стандартного и файлового строкового ввода-вывода: запись (вывод) в файл строк, чтение их из файла и вывод на экран.

Программа.

#include<conio.h>

#include<stdio.h>

int main ()

{ char string[256]; /* массив для строк ввода-вывода */

int n; /* переменная и счетчик строк */

char *filename="c:\\tc\\myfiIes\\char.dat"; /* спецификация файла */

FILE *fp; /* указатель файла */

clrscr (); /* очистка экрана */

/* Открытие файла для записи: */

if ((fp = fopen(filename, "w")) == NULL)

{ puts ("0ши6ка открытия файла.\n”

”Проверьте спецификацию файла.");

return 0; /* аварийный конец программы */

}

рuts ("Файл открыт для записи. ");

puts ("Введите несколько строк, нажимая в конце строк Enter.");

do /* цикл ввода строк в диалоге */

{ fgets (string, 255, stdin); /* ввод строки с клавиатуры */

fputs (string, fp); /* запись строки в файл */

printf ("Будете ещё вводить?”

” Если НЕТ, введите 0, иначе другую цифру: ");

scanf ("%d", &n); /* ввод числа для анализа */

fflush (stdin); /* очистка буфера ввода */

} while (n); /* условие цикла ввода строк */

freopen (filename, "r", fp); /* преоткрытие файла для чтения */

рuts ("\nВывод строк из файла;");

/* Цикл чтения строк из файла: */

for (n=0; fgets(string, 255, fp)!= NULL; n++)

fputs (string, stdout); /* вывод строки на экран */

printf ("\nПрочитано %d строк файла %s", n, filename);

fclose (fp); /* закрытие файла */

getch(); /* задержка экран результатов */

return 1; /* нормальный конец программы */

}

Результаты программы:

Файл открыт для записи.

Введите несколько строк, нажимая в конце строк Enter.

А роза упала

Будете еще вводить? Если НЕТ, введите 0, иначе другую цифру: 1

на лапу Азора.

будете ещё вводить? Если НЕТ, введите 0, иначе другую цифру: 0

Вывод строк из файла:

А роза упала

на лапу Азора.

Прочитано 2 строк файла c:\tc\myfiles\char.dat


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: