Что такое тип FILE
Как читать из файла и записывать в файл: getc( ), putc( ), fgets( ), fputs( ), fscanf( ), fprintf( )
Как проверять классы символов: isdigit( ), isalpha( ) и т. д.
Как превращать строки в числа: atoi( ) и atof( )
Как осуществлять быстрый выход: exit( )
Как распределять память: malloc( ), саllос( )
ВОПРОСЫ И ОТВЕТЫ
Вопросы
1. Что неправильно в этой программе?
main( )
{ int *fp;
int k;
fp = fopen("желе");
for(k = 0; k < 30; k++)
fputs(fp, "Нанетта ест желе.");
fclose("желе");
}
2. Что будет делать следующая программа?
#include <stdio.h>
#include <ctype.h>
main(argc, argv)
int argc;
char *argv[ ];
{ int ch;
FILE *fp;
if((fp=fopen(argv[1], "r")) == NULL)
exit(1);
while((ch=getc(fp)) != EOF)
if(isdigit(ch))
putchar(ch);
fclose (fp);
}
3. Вce ли правильно в выражении isalpha(c[i]), где с является массивом типа char. Что можно сказать о isalpha(c[i ++])?
4.Используйте функции классификации символе" для подготовки выполненния atoi( ).
5. Как вы могли бы распределить, память для размещения массива структур?
Ответы
1. Должна быть директива #include <stdio.h> для определения ее файлов. Следует описать указатель fp файла: FILE *fp; функция fopen( ) должна иметь вид fopen("желе", "w"), или, может быть, включать "а" . Порядок аргументов в fputs( ) должен быть обратным. Функция fclose( ) требует указателя файла, а не имени файла: fclose(fp).
2. Она будет открывать файл, заданный как аргумент командной строки, и выво дить на печать все цифры в файле. Программа должна проверять (но не делает этого), не аргумент ли это командной строки.
3. Первое выражение правильно, так как с[i] имеет значение типа char. Второе выражение не выводит компьютер из строя, но может давать непредсказуемый результат. Причина в том, что isalpha( ) является макроопределением, у которого, по всей вероятности, аргумент появляется дважды в определяющем выражении (проверка на принадлежность к регистру строчных букв, а зачем - прописных букв) и это дает в результате два увеличения i. Лучше всего избегать использования оператора увеличения в аргументе макрофункции.
4.
#include <stdio.h>
#include <ctype.h>
#define issign(c) (((c) == '-' || (c) == '+') ? (1) : (0)) atoi(s);
char *s;
{
int i = 0;
int n, sign;
while(isspace(s[i]))
i ++; /* пропуск пустого символа */
sign = 1;
if(issign(s[i])) /* установка необязательного знака */
sign = (s[i++] == '+') ? 1 : -1;
for(n = 0; isdigit(s[i]); i++)
n = 10*n + s[i] - '0';
return(sign * n);
}
5. Предположим, что wine является именем структуры. Эти операторы, надлежащим образом расположенные в программе, будут выполнять данную работу.
struct wine *ptrwine;
char *calloc( );
ptrwine = (struc wine *) calloc(100, sizcof(struct wine));
УПРАЖНЕНИЯ
1. Напишите программу копирования файла, которая использует имена исходного файла файла и копируемого файла как аргументы командной строки.
2. Напишитe программу, которая будет принимать все файлы, заданные радом аргументов командной строки, и печатать их один за другим. Используйте argc для создания цикла.
3. Модифицируйте вашу программу инвентаризации книг в гл. 14 так, чтобы информация, которую вы вводите, добавлялась в файл, названный mybooks.
4. Используйте gets( ) и atoi( ) для создания функции, эквивалентной нашей getint( ) в гл. 10.
5. Перепишите нашу программу из гл. 7, считающую слова, используя макроопределения ctype.h и аргумент командной строки для обработки файла.
Приложения.
ПРИЛОЖЕНИЕ А. ДОПОЛНИТЕЛЬНАЯ ЛИТЕРАТУРА
Если вы хотите больше узнать о языке Си и вообще о программировании, то найдете полезной следующую литературу:
ЯзыкСи
Kernighan Brian W. and Ritchie Dennis M., The СProgramming Language, Prentice-Hall, 1978. (Имеется перевод: КЕРНИГАН Б., Ритчи Д. Язык программирования Си.- M.: Финансы и статистика, 1985.)
Первая и наиболее авторитетная книга по языку Си. (Заметим. что один из авторов этой книги Деннис Ритчи - создатель языка Си.) Практически она является официальным описанием языка и включает много интересных примеров. Однако авторы предполагают, что читатель знаком с системным программированием.
Feuer Alan R., The С Puzzle Hook, Prentice-Hall, 1982. (Имеется перевод: Фьюэр А. Задачи по языку Си.- M.: Финансы и статистика, 1985.)
Книга содержит большое количество программ, результат работы которых вы можете предсказать. Она дает хорошую возможность проверить и расширить ваши знания о языке Си. Книга включает ответы и пояснения.
Ritchie D. M., Johnson S. С., Lesk M. E., and Kernighan В. W., The СProgramming Language, The Bell System Technical Journal, Vol. 57, No. 6, July-August 1978.
В статье обсуждается история создания языка Си и дается обзор особенностей программирования с использованием этого языка.
BYTE, Vol. 8, No. 8, August 1983.
Этот выпуск журнала "Байт" посвящен языку Си. Он содержит статьи, где обсуждаются история его создания, концепции и применения. Проверяются и оцениваются двенадцать компиляторов языка Си для микропроцессоров. Включена также обширная современная библиография книг и статей по языку Си. Каждая книга и статья включает краткое содержание.
Программирование