7. Ввод и вывод - форматированный и беcформатный. Работа с файлами. Строки Си. Функции работы со строками. (1109525)
Текст из файла
Кафедра математического моделирования и информатики: первый курс, первый семестрЯзык программирования СиБикулов Д.А., Иваницкая Н.В., Иванов А.П.Семинар 7. Ввод и вывод: форматированный ибесформатный. Работа с файлами. Строки Си. Функцииработы со строками.1 Форматированный выводФорматированный вывод выполняет функция printf(), которая описана в стандартнойбиблиотеке <stdio.h>:int printf (char *format, arg1, arg2, ...);Эта функция преобразует, форматирует и печатает свои аргументы в стандартном выводесогласно заданной строке формата. Возвращает она количество напечатанных символов.Любая спецификация формата начинается знаком «%» и заканчивается символомспецификатором.
Перечислим наиболее употребительные символы-спецификаторы:СимволdxucsfeEgGlfpТип аргументаintunsigned intunsigned intcharchar*floatdoubledoubledoubledoubledoublevoid*Описаниедесятичное целоебеззнаковое шестнадцатеричное целоебеззнаковое десятичное целоеодиночный символстрока символоввещественное числонаучный формат со строчной eнаучный формат с прописной Eлибо e, либо f — что корочелибо E, либо f — что корочевывод чисел с двойной точностьювывод адреса (указателя)Функция printf() использует свой первый аргумент (форматирующую текстовуюстроку), чтобы определить, сколько еще ожидается аргументов и какого они будут типа.Правильный результат не удастся получить, если аргументов будет не хватать или ихтипы не будут совпадать с указанными в строке формата.
В форматирующей строкеможно писать любой текст – он будет просто напечатан, но кроме того, с помощьюспециальных форматирующих последовательностей символов можно управлятьправилами вывода прочих аргументов. Символ «%» используется для обозначения началаформатирующей последовательности, для печати самого символа «процент» его надоудвоить: «%%».Для печати переменных long и short типов к спецификаторам следует добавлять в началеl или h соответственно. Например, для печати переменной типа long int спецификаторформата выглядит так: %ld.Для добавления табуляции в строке формата используется управляющаяпоследовательность «\t», для перевода курсора на следующую строку — «\n».Для каждого спецификатора формата можно задать минимальную ширину поля вывода.Так, для заполнения ведущими нулями целого числа до ширины в 6 знаков, надо написать«%06d».
Если ширина исходного числа окажется больше указанной, то дополнительныхнулей проставлено не будет, а ширина поля автоматически увеличится, чтобы11.10.20161Кафедра математического моделирования и информатики: первый курс, первый семестрпоместилось все число. Помимо заполнения нулями можно задать заполнение пробелами,для этого не надо указывать первый ноль в описании формата: «%6d».
Модификаторыминимальной ширины чаще всего используются для форматирования таблиц.Для каждого спецификатора формата можно задать модификатор точности. Например,чтобы вывести число с плавающей точкой с точностью до 4 знака, надо написать «%.4f».Поведение модификатора точности зависит от типа данных: для строк он задаетмаксимальную ширину поля (если строка окажется длиннее, то последние символы будутотброшены), для вещественных чисел он задает число знаков после запятой, а дляформатов «%g» и «%G» задает число значащих цифр. Для целых чисел модификаторточности обозначает минимальное число цифр, и если число оказывается меньше, то онодополняется ведущими нулями.Модификаторы точности и ширины поля можно комбинировать.
Например, что задатьширину поля 20 и вывести число с плавающей точкой и четырьмя цифрами после запятой,надо написать «%20.4f». Чтобы вывести строку минимум из 8 символов и максимум из 12,надо написать (не очень интуитивно, что сначала идет меньшее число, но это не опечатка)«%8.12s».2 Форматированный вводФорматированный ввод выполняет функция scanf(), которая описана в стандартнойбиблиотеке <stdio.h> и является аналогом printf() для ввода:int scanf(char *format, pointer1, pointer2, ...);Функция scanf() читает символы из стандартного входного потока, интерпретирует ихсогласно спецификациям форматирующей строки и сохраняет результаты в своиостальные аргументы, каждый из которых должен быть указателем.
Указатель определит,где будут запоминаться должным образом преобразованные данные.Функция scanf() прекращает работу, когда оказывается, что исчерпался формат иливодимая величина не соответствует управляющей спецификации.В качестве результата scanf() возвращает количество успешно введенных элементовданных.Функция scanf()функция printf().работаетстемижесимволами-спецификаторами,чтоиПри вводе строк функция scanf() со спецификатором «%s» читает до первогопробельного разделителя: перевода на новую строку, табуляции, пробела. Поэтому нельзяиспользовать один вызов scanf() для чтения строки «Привет, мир!», в переменную будетзаписано только «Привет,».Функция scanf() допускает добавление модификаторов (ширина поля и др.) кспецификаторам формата.
Так, для строк, если задан модификатор ширины поля «%80s»,то будет прочитано не более 80 символов. Следующий ввод начнется с того места, гдезавершился предыдущий.У функции scanf() есть также особая возможность, которой нет у printf(): т. н.спецификатор универсального формата — задание набора сканируемых символов.Например, если в качестве спецификатора формата указан «%[ABC]», то всоответствующий символьный массив будет считаны из входного потока толькоперечисленные символы: A, B и C. Как только scanf() находит символ, неперечисленный в наборе, он останавливает считывание в переменную, соответствующуюнабору сканируемых символов.
Если первым символом стоит «^», то набор трактуется11.10.20162Кафедра математического моделирования и информатики: первый курс, первый семестр«наоборот»: ввод символов, не входящих в набор. Набор символов чувствителен крегистру.Пример.#include <stdio.h>int input_output(){int nn;char cc;float ff;double dd;printf("INPUT nn, cc, ff, dd\n");// в качестве указателей используются адреса соответствующих// переменных:scanf("%d%c%f%lf", &nn, &cc, &ff, &dd);printf("nn=%d\tcc=%c\tff=%f\tdd=%lf", nn, cc, ff, dd);return 0;}Одна из самых распространенных ошибок случается, если вместо того, чтобы написать:scanf("%d", &nn);указывают в аргументе не указатель на считываемую переменную, а ее саму:scanf("%d", nn);Компилятор о подобной ошибке ничего не сообщает, но переменную nn введенноезначение помещено не будет и программа может вообще аварийно завершиться во времяисполнения.3 Работа с файламиДля того чтобы можно было читать из файла или писать в файл, он должен бытьпредварительно открыт с помощью функции fopen() (<stdio.h>), которая после вызовавозвращает указатель на файл, используемый в дальнейшем для доступа к файлу.Этот указатель ссылается на структуру, содержащую информацию о файле (адрес буфера,положение текущего символа в буфере, открыт файл на чтение или на запись, были лиошибки при работе с файлом и не встретился ли конец файла).
Определения, полученныеиз <stdio.h>, включают описание такой структуры, называемой FILE.Для определения указателя файла требуется задать описания вида:FILE *fp;fp = fopen( "z:\\filename.txt", "r");Здесь fp – указатель на FILE, а fopen() возвращает указатель на FILE. Первый аргументфункции fopen() – строка, содержащая имя файла.
Второй аргумент несет информацию орежиме. Это тоже строка, в ней указывается, каким образом пользователь намеренработать с файлом. Возможны следующие режимы открытия файла:"r"(read)– файл открывается на чтение, ошибка, если файла нет;"w"(write)– файл открывается на запись, файл создается, если его нет;"a"(append) – добавление в конец файла, файл создается, если его нет;"r+"11.10.2016(r+w)– файл открывается на чтение и запись, ошибка, если файла нет;3Кафедра математического моделирования и информатики: первый курс, первый семестр"w+"(w+r)– файл открывается на чтение и запись, файл создается, если его нет,если же файл есть – то его содержимое удаляется;"a+"(a+r)– файл открывается на чтение и запись в конец, файл создается,если его нет;"t"(text)"b"(binary) – аналогичный предыдущему дополнительный флаг, он означает,что файл открывается в бинарном режиме, при котором никакихпреобразований конца строк при чтении-записи не выполняется.– дополнительный флаг, который можно указывать в сочетаниис другими флагами в одной строке, означает, что файл открываетсяв текстовом режиме, при котором из файла на месте конца строки«\n» будет прочитано два символа: «\r\n», а при записи, наоборот,на месте двух символов «\r\n» будет записан один «\n»;этот флаг считается установленным по умолчанию, поэтомууказывать его явно – не обязательно;При возникновении любой ошибки fopen() возвращает NULL, а получить код ошибкиможно, воспользовавшись функцией ferror(fp).Функция:int fclose(FILE *fp);является обратной по отношению к fopen(), она разрывает связь между указателем нафайл и внешним именем, которая раньше была установлена с помощью fopen(),освобождая тем самым этот указатель для других файлов.После того, как файл открыт на запись, в него можно записать данные при аналогафункции printf():int fprintf( FILE* fp, const char *format, ...
);А если файл открыт на чтение, то из него можно читать аналогом функции scanf():int fscanf( FILE* fp, const char *format, ... );В любой программе автоматически открыты три стандартных потока ввода-вывода:stdinstdout(аналог cout в Си++)– стандартный поток вывода, связан с консолью;stderr(аналог cerr в Си++)– стандартный поток выводаошибках, связан с консолью;(аналог cin в Си++)– стандартный поток ввода, связан с консолью;сообщенийобС ними можно работать сразу, указывая их в соответствующих параметрах функций вводаи вывода, в том числе – бесформатных, о которых речь пойдет дальше.Если нужно гарантировать немедленный вывод данных в файл (например, длянемедленного отображения выводимых данных в консоли), следует воспользоватьсяфункцией опустошения буфера ввода-вывода для данного файла:int fflush(FILE* fp);Признак достигнутого конца файла можно проверить так:while( !feof(fp) ) { ...
/* любые операции чтения */ };11.10.20164Кафедра математического моделирования и информатики: первый курс, первый семестр4 Бесформатный вывод и вводsize_t fread( void *ptr, size_t size, size_t nobj, FILE* fp );fread()читает из потока stream в массив ptr не более nobj объектов размера size.Она возвращает количество прочитанных объектов, которое может быть меньшезаявленного.Для индикации состояния после чтения следует использовать feof и ferror.size_t fwrite( const void* ptr, size_t size, size_t nobj, FILE* fp );пишет из массива ptr в stream nobj объектов размера size; возвращает числозаписанных объектов, которое в случае ошибки меньше nobj.fwrite()Среди прочих функций бесформатного вывода отметим функции чтения и записи строки:intfputs( const char* str, FILE* fp );// записьchar* fgets( char* str, int size, FILE* fp ); // чтениечтения-записи символа:intintfputc( int chr, FILE* fp );fgetc( FILE* fp );// запись// чтениеи функцию возврата зря прочитанного символа обратно в поток, из которого он былпрочитан:int ungetc ( int chr, FILE* fp );Эта последняя функция может вернуть в поток чтения файла не обязательно тот самыйсимвол, который был прочитан перед этим – вернуть можно любой символ! Послевыполнения этой функции следующая операция чтения из файла прочитает именно этотвозвращенный символ.Пример.#include <stdio.h>// функция создает файл с именем f1.txt для записи// заполняет его данными: массив, таблица, символ, строкаvoid create_file(){int i=123, j;char ch, cm[33];FILE *fp;//"w" - файл открыт для записи,// маркер указывает на начало файла, при записи// старое содержимое затираетсяif( (fp=fopen("f1.txt","w")) != NULL ) {for(i=0; i<10; i++)fprintf(fp,"%d\t",i*i*i);fprintf(fp,"\n");// пишем таблицу чисел:for(i=0; i<4; i++) {for(j=0; j<7; j++)fprintf(fp,"%d\t",i+j);fprintf(fp,"\n");}puts("INPUT SYMBOL:"); // пишем строку в консольch=getchar();// читаем один символ с консоли11.10.20165Кафедра математического моделирования и информатики: первый курс, первый семестрfputc(ch,fp);fputc('\n',fp);// пишем символ в файл// пишем символ конца строки в файлputs("INPUT STRING:"); // пишем строку в консольgets(cm);// читаем строку из консолиputs(cm)// пишем строку в консоль;fputs(cm,fp);fputc('\n',fp);fclose(fp);// пишем строку в файл// пишем символ конца строки в файл// закрываем файл}// конец if, где файл был открытelse printf("ERROR WHILE OPENING FILE!!\n");}/////////////////////////////////////////////////// имя файла для чтения передается функции в качестве// входного параметраvoid read_from_file(char* filename){int i, j, matr[4][7], mass[10];char cc, str[34];FILE *fp;if( (fp=fopen(filename,"r")) != NULL) {for(i=0; i<10; i++) {fscanf(fp,"%d",&mass[i]);printf("%d\t",mass[i]);}printf("\n");for(i=0; i<4; i++) {for(j=0; j<7; j++) {fscanf(fp,"%d",&matr[i][j]);printf("%d\t",matr[i][j]);}printf("\n");}// считываем символы из файла и тут же их пишем в консоль:while((cc=fgetc(fp)) != '\n')putchar(cc);fgets(str,33,fp);puts(str);// читаем строку из файла// пишем строку в консольfclose(fp);// закрываем файл}// конец if, где файл был открытelse printf("ERROR WHILE OPENING FILE FOR READING!!\n");}/////////////////////////////////////////////////void main(){char filename[21];create_file();puts("INPUT FILENAME:");gets(filename);puts(filename);read_from_file(filename);}11.10.20166Кафедра математического моделирования и информатики: первый курс, первый семестр5 Строки Си.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.