|
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 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |