Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Тема 13. Стандартные библиотеки языка Си 2 страница



putchar(message[count]);

}

return 0;

}

 

Результат: Displayed with putchar().

 

 

Когда считывается двоичный файл, то определить наличие конца файла таким образом нельзя. Для этого используется функция feof().

 

Формат:

int feof (FILE * имя_указателя );

 

Данная функция возвращает ненулевое значение, если конец файла достигнут и 0 - в противном случае.

Конструкция while(!feof(fp))

{ ch=getc(fp); …….} читает файл, открытый в любом режиме до конца.

 

Пример: программы, котораяоткрывает файл с именем dat длячтения, файл с именем out – для записи, читает содержимое файла dat, преобразует малые латинские буквы в большие и записывает результат в файл out.

#include <stdio.h>

#include <stdlib.h>

main ()

{

int c;

FILE *p, *q;

p=fopen (“dat”,”r”);

q=fopen (“out”,”w”);

if (!p)

{

printf (“Невозможно открыть файл dat! Программа завершается!”);

exit (1);

}

if (!q)

{

printf (“Невозможно открыть файл out! Программа завершается!”);

exit (1);

}

while ((c=fgetc(p))!=EOF)

{

if (c>=’a’ && c<=’z’) c+=’A’-‘a’;

fputc (c, q);

}

close (p);

close (q);

}

Результат: содержимое файла «dat» будет записано в файл «out» с заменой всех строчных букв на прописные (заглавные).

 

РЕКОМЕНДУЕТСЯ

Используйте функцию feof() для проверки окончания файла при работе с двоичными файлами.

 

НЕ РЕКОМЕНДУЕТСЯ

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

Не используйте константу EOF при работе с двоичными файлами.

 

 

Пример: feof.c - использование функции feof() для обнаружения конца файла

#include <stdlib.h>

#include <stdio.h>

#define BUFSIZE 100

int main(void)

{

char buf[BUFSIZE];

char filename[60];

FILE *fp;

puts("Enter name of text file to display: ");

gets(filename);

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

{

fprintf(stderr, "Error opening file.");

exit(1);

}

while (!feof(fp))

{

fgets(buf, BUFSIZE, fp);

printf("%s",buf);

}

fclose(fp);

return 0;

}

Результат:

Enter name of text file to display:

hello.txt

Hello World!

 

 

13.3.2. Функции построчного ввода-вывода

 

Функции построчного ввода-вывода – это функции, за одно обращение к которым, переносится целая строка символов.

 

Функции построчного ввода в случае успеха возвращают указатель на прочитанную строку символов, в случае ошибки или достижения условия конца файла функции возвращают NULL.

 

Функции построчного ввода:

· char *gets (char * строка ); - функция принимает байты со стандартного потока ввода stdin и размещает их по адресу, на который ссылается указатель строка. Прием символов завершается после считывания символа ’ \n ’ (нажатие ENTER), а сам этот символ преобразуется в ’ \0 ’. Необходимо зарезервировать место для принимаемой строки.



· char *fgets (char * строка, int колич_символов, FILE * имя_указателя ); -функция принимает байты из открытого файла, на который ссылается указатель имя_указателя и размещает их по адресу, заданному указателем строка. Прием байтов завершается после получения колич_символов или получения символа ’ \n ’. Сам символ ’ \n ’ передается в строку. Последним символом в обоих случаях является ’ \0 ’.

ВНИМАНИЕ

Перед началом использования необходимо зарезервировать место для строки.

Функцию gets() следует использовать с осторожностью, потому что не всегда известно заранее, сколько символов введет пользователь, и вследствие этого функция может записать часть строки уже вне выделенного буфера.

Пример:

FILE *fp;

char s[100];

fp=fopen (“dat.txt”,”r”);

fgets (s, 20, fp);

Пример: get.c - ввод строковых данных с клавиатуры с помощью функции gets()

#include <stdio.h>

char input[257];

int main(void)

{

puts("Enter some text, then press Enter: ");

gets(input);

printf("You entered: %s\n", input);

return 0;

}

Результат:

Enter some text, then press Enter:

This is a test

You entered: This is a test

Функции построчного вывода в случае успеха возвращают код последнего записанного в файл символа строки и EOF - в случае ошибки.

 

Функции построчного вывода:

· int puts (char * строка ); - функция помещает строку символов, на которую ссылается указатель строка, в стандартный поток вывода stdout.

· int fputs (char * строка, FILE * имя_указателя ); - функция помещает строку символов, на которую ссылается указатель строка, в открытый файл, на который ссылается указатель имя_указателя.

РЕКОМЕНДУЕТСЯ

Используйте функцию puts() вместо printf(), если необходимо отобразить текстовое сообщение без вывода каких-либо значений.

НЕ РЕКОМЕНДУЕТСЯ

Не используйте спецификации ввода в функции puts().

 

Пример: put.c - отображение текста на экране с помощью функции puts()

#include <stdio.h>

char *message1 = "C";

char *message2 = "is the";

char *message3 = "best";

char *message4 = "programming";

char *message5 = "language!!";

int main(void)

{

puts(message1);

puts(message2);

puts(message3);

puts(message4);

puts(message5);

return 0;

}

Результат:

C

is the

best

programming

language!

 

 

13.3.3. Функции блокового ввода-вывода

 

Функции блокового ввода-вывода также называют функциями прямого ввода-вывода.

 

Функции fread() и fwrite() позволяют выполнить перенос блока байтов (записей) между файлом и программой.

 

Блок – это группа расположенных подряд байтов, не имеющих никаких специальных разделителей.

 

Формат:

int fread (void * имя_указателя1, int размер, int количество, FILE * имя_указателя2 );

Эта функция считывает количество элементов размером размер байт каждый в область памяти, определяемую указателем имя_указателя1, из открытого файла, на который ссылается указатель имя_указателя2. Функция возвращает число прочитанных байтов и EOF – в противном случае.

 

Формат:

int fwrite (void * имя_указателя1, int размер, int количество, FILE * имя_указателя2 );

Эта функция записывает количество элементов размером размер байт каждый из области памяти, определяемую указателем имя_указателя1, в открытый файл, описываемый переменной типа FILE, на которую указывает указатель имя_указателя2.

Пример: считывание целого числа из файла

int num;

FILE *fp;

fp=fopen (“dat”,”r”);

...

fread (&num, sizeof (int), 1, fp);

 

Также функции fread() и fwrite() могут использоваться для записи и чтения пользовательских типов.

 

Пример:

FILE *fp;

fp= fopen (“dat”,”r”);

struct st1

{

float b;

char name[80];

} cust;

fread (&cust, sizeof (struct st1), 1, fp);

 

 

Пример: direct.c - использование функций fwrite() и fread() для блочного ввода-вывода

#include <stdlib.h>

#include <stdio.h>

#define SIZE 20

int main(void)

{

int count, array1[SIZE], array2[SIZE];

FILE *fp;

for (count = 0; count < SIZE; count++)

array1[count] = 2 * count;

if ((fp = fopen("direct.txt", "wb")) == NULL)

{

fprintf(stderr, "Error opening file.");

exit(1);

}

if (fwrite(array1, sizeof(int), SIZE, fp)!= SIZE)

{

fprintf(stderr, "Error writing to file.");

exit(1);

}

fclose(fp);

if ((fp = fopen("direct.txt", "rb")) == NULL)

{

fprintf(stderr, "Error opening file.");

exit(1);

}

if (fread(array2, sizeof(int), SIZE, fp)!= SIZE)

{

fprintf(stderr, "Error reading file.");

exit(1);

}

fclose(fp);

for (count = 0; count < SIZE; count++)

printf("%d\t%d\n", array1[count], array2[count]);

return 0;

}

Результат:

0 0

2 2

4 4

6 6

8 8

10 10

12 12

14 14

16 16

18 18

20 20

22 22

24 24

26 26

28 28

30 30

32 32

34 34

36 36

38 38

 

 

Также при блоковом вводе-выводе могут использоваться функции getw() и putw().

 

Формат:

int getw (FILE * имя_указателя ); - возвращает число int, считанное из открытого файла

 

putw (int число, FILE * имя_указателя ); - записывает число в открытый файл, на который ссылается указатель имя_указателя.

 

Пример:

int num;

FILE *fp;

fp=fopen (“dat”,”r”);

num=getw(fp);

 

 

13.3.4. Функции форматированного ввода-вывода

 

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

 

Функции форматированного ввода-вывода являются функциями с переменным числом аргументов, первым из которых всегда является строка, задающая формат преобразования информации, которая состоит из следующих полей:

 

%[ флаги ][ ширина ][. точность ][ модификаторы ]< тип >

Флаги: «+», «-», «#», пробел.

 

Модификаторы: «F», «N», «h» «l»,, «L».

 

Наиболее употребляемые управляющие последовательности указаны в таблице 3.

 

Таблица 3

Последовательность

Значение

\a

Звуковой сигнал (предупреждение)

\b

Возврат на один символ назад

\f

Прогон страницы

\n

Перевод строки

\r

Возврат каретки

\t

Горизонтальная табуляция

\v

Вертикальная табуляция

\\

Обратная косая черта

\?

Знак вопроса

\’

Одинарная кавычка

\”

Двойная кавычка

Начало или конец текстовой строки

 

Наиболее часто используемые спецификации ввода указаны в таблице 4.

 

Таблица 4

Спецификация

Значение

Типы выводимых

переменных

%c

Одиночный символ

char

%d

Десятичное целое число со знаком

int, short

%ld

Десятичное длинное целое число со знаком

long

%f

Десятичное число с плавающей точкой

float

%s

Строка символов

массивы типа char

%u

Десятичное целое число без знака

unsigned int, unsigned short

%lu

Десятичное длинное целое число без знака

unsigned long

 

Функции ввода:

· fscanf (); - вводит из заданного потока

· sscanf (); -вводит из строки символов Си

· scanf (); -вводит из стандартного потока ввода stdin

Функции вывода:

· printf (); - выводит в стандартный поток вывода stdout

· vprintf (); - аналогично предыдущей функции

· fprintf (); - выводит в заданный поток

· vfprintf (); -аналогично предыдущей функции

· sprintf (); - выводит в строку символов Си

· vsprintf (); -аналогично предыдущей функции

РЕКОМЕНДУЕТСЯ

Обязательно используйте символ конца строки при выводе нескольких строк информации отдельными функциями printf().

НЕ РЕКОМЕНДУЕТСЯ

Не пытайтесь выводить несколько строк текста одним вызовом функции printf(). В большинстве случаев удобно вывести несколько строк несколькими операторами, чем обходиться одним вызовом функции с несколькими символами конца строки «\n».

Пример:

printf (“Это символ: %c, \nЭто число: %d\nЭто число с плав. \

точкой: %f\n”, ‘z’, 123, 456.789);

Результат:

Это символ: z

Это число: 123

Это число с плав. точкой: 456.789

ПРИМЕЧАНИЕ

В предыдущем примере можно заметить, что строка формата в функции printf() переносится на следующую строку. В конце первой строки кода косая черта «\» указывает, что строка формата продолжается в следующей строке кода. Компилятор воспринимает обе части строки формата как единое целое.

Пример:

#include <stdio.h>

int main (void)

{

char symb=’S’;

int i=25;

printf (“Это пример вывода\n“);

printf (“Символ: %c\n Число: %d\n“, symb, i);

return 0;

}

Результат:

Это пример вывода

Символ: S

Число: 25

Пример: fprintf.c - эквивалентность форматированного ввода в файл и в поток stdout

#include <stdlib.h>

#include <stdio.h>

void clear_kb(void);

int main(void)

{

FILE *fp;

float data[5];

int count;

char filename[20];

puts("Enter 5 floating-point numerical values.");

for (count = 0; count < 5; count++)

scanf("%f", &data[count]);

clear_kb();

puts("Enter a name for the file.");

gets(filename);

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

{

fprintf(stderr, "Error opening file %s.", filename);

exit(1);

}

for (count = 0; count < 5; count++)

{

fprintf(fp, "\ndata[%d] = %f", count, data[count]);

fprintf(stdout, "\ndata[%d] = %f", count, data[count]);

}

fclose(fp);

printf("\n");

return 0;

}

void clear_kb(void)

{

char junk[80];

gets(junk);

}

Результат:

Enter 5 floating-point numerical values.

3.14159

9.99

1.50

3.

1000.0001

Enter a name for the file.

numbers.txt

data[0] = 3.141590

data[1] = 9.990000

data[2] = 1.500000

data[3] = 3.000000

data[4] = 1000.000122

РЕКОМЕНДУЕТСЯ

Используйте функции printf() и puts() в связке со scanf(). Сначала выведите сообщение о том, какие данные должен ввести пользователь, а затем введите эти данные функцией scanf().

НЕ РЕКОМЕНДУЕТСЯ

Не забывайте использовать знак операции взятия адреса «&» перед переменными в функции scanf().

     

 

Пример:

#include <stdio.h>

int main (void)

{

int num;

scanf (“%d“, &num);

printf (“\nВы ввели число: %d“, num);

return 0;

}

Результат:

// введено число 17 с клавиатуры

Вы ввели число: 17

Пример: scanit.c - ввод числовых данных с использованием функции scanf()

#include <stdio.h>

#define QUIT 4

int get_menu_choice(void);

int main(void)

{

int choice = 0;

int int_var = 0;

float float_var = 0.0;

unsigned unsigned_var = 0;

while (choice!= QUIT)

{

choice = get_menu_choice();

if (choice == 1)

{

puts("\nEnter a signed decimal integer (i.e. -123)");

scanf("%d", &int_var);

}

if (choice == 2)

{

puts("\nEnter a decimal floating-point number(e.g. 1.23)");

scanf("%f", &float_var);

}

if (choice == 3)

{

puts("\nEnter an unsigned decimal integer (e.g. 123)");

scanf("%u", &unsigned_var);

}

}

printf("\nYour values are: int: %d float: %f unsigned: %u \n", int_var, float_var, unsigned_var);

return 0;

}

int get_menu_choice(void)

{

int selection = 0;

do

{

puts("\n1 - Get a signed decimal integer");

puts("2 - Get a decimal floating-point number");

puts("3 - Get an unsigned decimal integer");

puts("4 - Quit");

puts("\nEnter a selection:");

scanf("%d", &selection);

}while (selection < 1 || selection > 4);

return selection;

}

Пример: input.c - ввод числовой и текстовой информации с помощью функции scanf()

#include <stdio.h>

char lname[257], fname[257];

int count, id_num;

int main(void)

{

puts("Enter last name, first name, ID number separated");

puts("by spaces, then press Enter.");

count = scanf("%s%s%d", lname, fname, &id_num);

printf("%d items entered: %s %s %d \n", count, fname, lname, id_num);

return 0;

}

Результат:

Enter last name, first name, ID number separated

by spaces, then press Enter.

Corey Taylor 12345

3 items entered: Corey Taylor 12345

ВНИМАНИЕ

Пользуйтесь функцией scanf() с осторожностью. Если, например, ожидается ввод символа, а пользователь введет число, или если нужно число, а вводится символ, то программа может выдать пользователю весьма неожиданные результаты.

Пример: fscanf.c - чтение форматированных данных из файла с помощью функции fscanf()

#include <stdlib.h>

#include <stdio.h>

int main(void)

{

float f1, f2, f3, f4, f5;

FILE *fp;

if ((fp = fopen("INPUT.TXT", "r")) == NULL)

{

fprintf(stderr, "Error opening file.\n");

exit(1);

}

fscanf(fp, "%f %f %f %f %f", &f1, &f2, &f3, &f4, &f5);

printf("The values are %f, %f, %f, %f, and %f\n.", f1, f2, f3, f4, f5);

fclose(fp);

return 0;

}

Результат:

The values are 123.49997, 87.00999, 100.019997, 0.004560, and 1.0005000

ПРИМЕЧАНИЕ

Неточность машинного представления числа является причиной того, что выведенные значения отличаются от введенных на очень маленькие величины. Например, 100.2 выводится как 100.01999.

РЕКОМЕНДУЕТСЯ

Используйте функции gets() и scanf() вместо fgets() и fscanf(), если ввод должен выполняться только из стандартного потока stdin.

НЕ РЕКОМЕНДУЕТСЯ

Не забывайте избавляться от лишних символов в потоке ввода.

Пример: printer.c - вывод данных на принтер

#include <stdio.h>


Дата добавления: 2015-08-29; просмотров: 22 | Нарушение авторских прав







mybiblioteka.su - 2015-2024 год. (0.104 сек.)







<== предыдущая лекция | следующая лекция ==>