Файлы и потоки ввода-вывода
Автор: less12345 • Март 15, 2021 • Лабораторная работа • 3,396 Слов (14 Страниц) • 326 Просмотры
Министерство науки и высшего образования Российской Федерации
Федеральное государственное автономное образовательное учреждение высшего образования
«Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики»
Мегафакультет: компьютерных технологий и управления
Факультет: Информационной безопасности и компьютерных технологий
Кафедра: Проектирования и безопасности компьютерных систем
Направление (специальность): «Информационная безопасность»
Лабораторная работа
По дисциплине:
«Системное программирование»
На тему:
«Файлы и потоки ввода-вывода»
Вариант №20
Выполнила:
Студентка гр. N3354
Рощина А. В.
2020 г.
Задание:
[pic 1]
Пример работы программы:
[pic 2] [pic 3]
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
extern char *optarg;
extern int optind;
bool isPalindrome(char *inputStr); // функция проверки, является ли строка палиндромом. обрабатывает только CP437. кириллицу игнорирует.
bool isSymbol(char c); // функция проверки, не нужно ли игнорировать символ (игнорируется всё, кроме 0..1, A..Z, a..z)
void printError(int n); // вывод информации об ошибке в stderr
typedef struct globalArgs_t {
int maxLen; // параметр -x, максимальная длина палиндрома
int minLen; // параметр -n, минимальная длина палиндрома
bool printLines; // параметр -l,
bool useInputFile; // флаг "задан входной файл"
bool useOutputFile; // флаг "задан выходной файл"
const char *inputFileName; // имя файла для ввода, если задан
const char *outputFileName; // имя файла для вывода, если задан
} globalArgs_t;
typedef struct outputInfo_t // структура с информацией для вывода
{
char *str; // строка-палиндром
int line; // номер строки в файле
} outputInfo_t;
int main(int argc, char **argv)
{
static const char *optString = "x:n:l"; // доступные опции, первые две принимают аргумент
const int default_str_array = 0x50; // стартовые размеры выделяемой памяти для входной строки
const int default_output_array = 0x20; // и для массива выходных структур
globalArgs_t globalArgs;
// инициализируем опции по умолчанию
globalArgs.maxLen = 0;
globalArgs.minLen = 0;
globalArgs.printLines = false;
globalArgs.useInputFile = false;
globalArgs.useOutputFile = false;
globalArgs.inputFileName = "\0";
globalArgs.outputFileName = "\0";
int errorCode = 0;
// внутренний код состояния для финальных действий
// 0 - нужно освободить выделенную память и закрыть файл, если открыт
// 1 - ошибка открытия входного файла. ничего делать не нужно
// 2 - ошибка выделения памяти для строки. нужно закрыть файл, если открыт
// 3 - ошибка выделения памяти для выходных структур. нужно закрыть файл, если открыт, и освободить строку
// 4 - ошибка перераспределения памяти. нужно освободить выделенную уже память и закрыть файл, если открыт
// 5 - ошибка открытия выходного файла. нужно освободить выделенную память
int opt = getopt( argc, argv, optString );
while( opt != -1 ) {
switch( opt ) {
case 'l':
globalArgs.printLines = true;
break;
case 'x':
globalArgs.maxLen = atoi(optarg);
break;
...