Лабораторная работа №1 Тема: программирование основных алгоритмических конструкций на языке с++



Download 0,62 Mb.
bet15/28
Sana21.06.2022
Hajmi0,62 Mb.
#689734
TuriЛабораторная работа
1   ...   11   12   13   14   15   16   17   18   ...   28
Bog'liq
лабораторные работы по с 2сем

Чтение текстовых файлов.
Чтение текстовых файлов можно осуществить с помощью функции форматного ввода fscanf(). Она преобразует считанные данные из текстового представления в бинарное. Использование функции fscanf() аналогично функции ввода с клавиатуры scanf(), только первым аргументом должен быть указатель на файловую переменную
scanf (Указатель на файл,
"Управляющая строка",Арг1,Арг2,...); //.
Вот несколько примеров использования функции fscanf():
int K, kolvo; float X, Y; char C; char S[80];
FILE *f;
. . .
fscanf(f, "%d", &K); fscanf(f, "%f", &X); fscanf(f, "%c", &C); fscanf(f, "%s", S); fscanf(f, "%f%f", &X, &Y);
. . .
Переменная kolvo принимает значение, равное количеству введённых данных.
5.2.4. Запись в файл
Запись бинарных данных.
Запись бинарных данных в файл можно осуществить с помощью функции fwrite(). Она имеет 4 аргумента: имя массива, значения элементов которого необходимо записать в файл, размер одного элемента массива, число записываемых элементов, указатель файловой переменной. Возвращаемое функцией fwrite() значение равно реальному количеству записанных элементов. Пусть, например, необходимо записать в файл 512 вещественных чисел типа float из массива mas unsigned int kolvo;
float mas[512]; FILE *f; //.
После открытия файла выполняем запись kolvo = fwrite(mas, sizeof(float), 512, f); //.
Здесь функция sizeof(float) вычисляет размер записываемого элемента, а переменная kolvo принимает значение, равное реальному количеству записанных элементов. Её значение может быть меньше предусмотренных 512 элементов, поскольку неожиданно может закончиться место на диске.
Запись в текстовый файл.
Запись бинарных данных в текстовый файл можно осуществить с помощью функции форматного вывода fprintf(). Она преобразует записываемые данные в текстовое представление в соответствие с форматной строкой. Использование функции fprintf() аналогично функции вывода на экран printf(), только первым аргументом должен являться указатель на файловую переменную.
printf (Указатель на файл,
"Управляющая строка",Арг1,Арг2,...); //.
Управляющая строка может содержать компоненты трёх типов:
1) обычные символы, которые просто выводятся на экран; 2) управляющие константы из табл.5; 3) спецификации преобразования.
Каждая спецификация преобразования служит для вывода на экран очередного данного из списка аргументов Арг1, Арг2, ... Начинается спецификация знаком %, заканчивается
— символом преобразования. В следующем примере fprintf(f,"Результат вычислений равен %12.3f\n", y);
символом преобразования служит буква f. Следовательно, функция printf() выведет на экран вместо %12.3f значение переменной y, которая стоит в списке аргументов. При этом всего для значения переменной y будет предусмотрено 12 знаков, среди них 3 — для дробной части.
5.2.5. Закрытие файла
По окончании работы с файлом его необходимо закрыть. Для закрытия файла используется функция fclose(), аргументом которой является указатель на файловую переменную, например fclose(f); //.
При удачном закрытии функция возвращает ноль, а при ошибке — значение -1. Поэтому при закрытии файла можно использовать следующего вида проверку
if (fclose(f) < 0)
{ printf("Невозможно закрыть файл!!!"); } //.
5.2.6. Позиционирование указателя файла
Нередко встречается необходимость считывать и записывать данные в файл непоследовательно. При чтении или записи нескольких байт указатель текущей позиции автоматически смещается на нужное число позиций. Существует также функция принудительного позиционирования указателя текущей позиции в нужное место fseek(). Эта функция имеет три аргумента: указатель на файловую переменную FILE *f, величина смещения целого знакового типа, величина целого типа, характеризующая точку отсчёта смещения. Для третьего аргумента предусмотрены три возможных значения, заданные как целые константы: SEEK_CUR=1 — смещение отсчитывается от текущей позиции указателя, SEEK_SET=0 — смещение отсчитывается от начала файла, SEEK_END=2 — смещение отсчитывается от конца файла. Рассмотрим несколько примеров:
fseek(f, 0, SEEK_SET); fseek(f, -8, SEEK_END); fseek(f, 5, SEEK_CUR); //.
Первая из команд позиционирует указатель в начало файла, вторая — в восьми байтах от конца файла, третья команда смещает указатель на 5 байт вперёд.
Функция ftell() позволяет узнать номер текущей позиции указателя, например,
N=ftell(f); //.
Функция feof() даёт возможность проверить, достиг ли указатель конца файла. Она возвращает ненулевое значение, если конец файла достигнут.
5.2.7. Понятие потока ввода-вывода
Все современные операционные системы поддерживают так называемый механизм потоков. Поток представляет собой последовательность байт. Он всегда имеет только одно направление и по отношению к программе является потоком или ввода, или вывода. Программа может читать данные из потока ввода и выводить данные в поток вывода. По сути работа с потоком ничем не отличается от работы с файлом. Поэтому для реализации потоков в языке С используются принципы взаимодействия с файлами. Доступ к потоку осуществляется с помощью переменной типа FILE * (указатель на файловую переменную). Существуют три стандартных потока, подключаемые к каждой прогрмме: *stdin — входной поток, связанный с клавиатурой; *stdout — выходной поток, связанный с экраном; *stderr — выходной поток для вывода сообщений об ошибках, тоже связанный с экраном. Таким образом, следующие команды вывода сообщения на экран равносильны
printf("Сообщение"); fprintf(stdout,"Сообщение"); //.
5.2.8. Функции библиотеки ввода-вывода
Помимо перечисленных выше библиотека ввода-вывода stdio содержит ещё много полезных функций. Далее в качестве справочной информации приведены прототипы некоторых из них.
Функция remove удаляет файл с именем filename int remove(char *filename); //.
Функция rename переименовывает файл old в файл new int rename(char *old, char *new);
В табл.8 приведены функции ввода-вывода бинарных данных с кратким описанием и прототипом.
Таблица 8 Функции ввода-вывода бинарных данных

Для любого потока

fgetcCчитывает один символ из потока A, int fgetc(FILE *A) fgetsСчитывает строку s длиной не более n символов из потока
A, char *fgets(char *s, int n, FILE *A)
fputcВыводит символ С в поток A, int fputс(int С, FILE *A) fputsВыводит строку символов S в поток A, int fputs(char *S,
FILE *A)
getcCчитывает из потока A один символ, int getc(FILE *A) putcВыводит символ С в поток A, int putc(int С, FILE *A) putwВыводит в поток A целое значение W, int putw(int W, FILE
*A)
getwСчитывает из потока A целое число, int getw(FILE *A)

Для потока stdin

gets

Считывает строку символов S из потока stdin, char
*gets(char *S)

getchar

Считывает символ из потока stdin, int getchar(void)

Для потока stdout

putchar

Выводит символ С в поток stdout, int putchar(int С)

puts

выводит строку S в поток stdout, int puts(const char *S)


5.2.9. Классы и объекты потоков ввода-вывода
В С++ применяется объектно-ориентированный подход к реализации обмена данными с потоками ввода-вывода. Стандартная библиотека языка C++ iostream содержит описания классов, инкапсулирущих потоки ввода-вывода. Базовым для классов потоков является класс ios. Его наследники — классы istream и ostream — отвечают за ввод и вывод соответственно. Они имеют общего наследника — класс iostream. При запуске программы автоматически создаются объекты cin класса istream и объекты cout, cerr, clog класса ostream. Первый из них связан с клавиатурой и поддерживает операцию взятия из потока >>. Остальные связаны с экраном и поддерживают операцию помещения в поток
<<.
Для организации файлового ввода-вывода классы istream, ostream и iostream обладают наследниками ifstream, ofstream и fstream соответственно. Перечисленные классы имеют множество методов для управления вводом и выводом и могут использовать так называемые манипуляторы. К примеру, целые числа обычно интерпретируются как десятичные. Поместив в поток cout манипулятор hex, получим на экране числа в шестнадцатеричной системе cout << "N=" << hex << N << endl; //.
Аналогично работают манипуляторы oct и dec. Точность вывода в поток вещенственных чисел регулирует манипулятор precision(m), где m — количество знаков после запятой. При m=0 устанавливается точность по умолчанию (шесть знаков). Подробнее о форматировании ввода-вывода можно почитать в [1] стр.630–672.
Использование файлового ввода-вывода становится доступным после включения в программу заголовочного файла fstream. Чтобы открыть файл на чтение необходимо создать объект класса ifstream и передать имя открываемого файла его конструктору в качестве параметра ifstream fileIn("d:\\text\\fileIn.txt"); //.
Аналогично выполняется открытие файла для записи, только используется объект класса ofstream ofstream fileOut("d:\\text\\fileOut.txt"); //.
Имена объектов fileIn и fileOut можно использовать наряду со стандартными потоками cin и cout, например, for(k=1;k<=100;k++) {fileOut << x[k];} //.
Уточнить, как именно следует отрывать файл, можно с помощью второго (необязательного) аргумента конструктора. Для этого можно использовать следующие константные значения ios::app — открытие файла на добавление, ios::ate — на добавление с возможностью перемещаться по файлу, ios::trunc — на перезапись (прошлое содержимое теряется), ios::nocreate — если файл не существует, то открытие не выполняется, ios::noreplace — если файл существует, то открытие не выполняется. Так, например, для открытия файла на добавление необходимо писать ifstream fileOut("d:\\text\\fileOut.txt", ios::app);
После использования файл необходимо закрыть с помощью метода close().
Подробнее об использовнии потоковых объектов можно прочитать в [2] стр. 505–542.
5.3. Практическое задание
При выполнении практического задания придерживайтесь следующей последовательности действий.

  1. Обязательно изучите описание, предлагаемое выше.

  2. Разберите примеры, приводимые в описании.

  3. Осмыслите задачу, предлагаемую в вашем варианте.

  4. Составьте словесный алгоритм решения задачи.

  5. Представьте алгоритм решения в виде блок-схемы.

  6. Переведите алгоритм на язык программирования.

5.3.1. Варианты заданий Вариант 1.
Напишите функцию приближённого вычисления квадратного корня по формуле√ xn = xn−1/2 + a/2xn−1, x1 = 1, x a. Найдите корни всех чисел из входного текстового файла, добавить их в тот же файл рядом с исходными.

Download 0,62 Mb.

Do'stlaringiz bilan baham:
1   ...   11   12   13   14   15   16   17   18   ...   28




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish