Главная » Все файлы » Просмотр файлов из архивов » PDF-файлы » 7. Ввод и вывод - форматированный и беcформатный. Работа с файлами. Строки Си. Функции работы со строками.

7. Ввод и вывод - форматированный и беcформатный. Работа с файлами. Строки Си. Функции работы со строками. (Семинарские занятия)

PDF-файл 7. Ввод и вывод - форматированный и беcформатный. Работа с файлами. Строки Си. Функции работы со строками. (Семинарские занятия) Информатика (36963): Семинары - 1 семестр7. Ввод и вывод - форматированный и беcформатный. Работа с файлами. Строки Си. Функции работы со строками. (Семинарские занятия) - PDF (36963) - СтудИ2019-04-28СтудИзба

Описание файла

Файл "7. Ввод и вывод - форматированный и беcформатный. Работа с файлами. Строки Си. Функции работы со строками." внутри архива находится в папке "Семинарские занятия". PDF-файл из архива "Семинарские занятия", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст из PDF

Кафедра математического моделирования и информатики: первый курс, первый семестрЯзык программирования СиБикулов Д.А., Иваницкая Н.В., Иванов А.П.Семинар 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, ... );В любой программе автоматически открыты три стандартных потока ввода-вывода:stdinstdout(аналог 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 Строки Си.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
428
Средний доход
с одного платного файла
Обучение Подробнее