Problem Set 9: Files

Objectives

  • Освоить работу с аргументами командной строки.
  • Освоить работу с файлами.
  • Понять, что существует вероятность того, что насущная проблема может быть сложнее решаема, чем кажется.

Task 1: Count the Words

Напишите программу count_words.c, которая посчитает, сколько раз в файле находится слово: ananas. Ответ будет записан в тот же файл (содержание файла должно быть перезаписано). Словом считается каждая подходящая последовательность знаков, отделённая пробелом.

Comment

В целой программе регистр не имеет значения.

В рамках программы не разрешается использование каких-либо библиотечных функций (strlen(), strcpy(), strcmp() и т.д.). Разрешается использовать следующие 4 функции:

  • fopen() для инициализации работы с файлом
  • fclose() для завершения работы с файлом
  • fgetc() для чтения из файла
  • fputc() для записи в файл

Программа будет иметь один аргумент:

  • файл ввода\вывода (название файла)

Пример использования программы может выглядеть следующим образом. Текст, выделенный жирным шрифтом будет представлять ввод от пользователя. Рядок, начинающийся символом '$' будет представлять командную строку.

$ ls
bananas.txt count_words
$ ./count_words bananas.txt
$ ls
bananas.txt count_words

В случае, если содержание файла bananas1.txt следующее:

Bananas are edible fruits, botanically berries. In some countries, bAnAnAs used for cooking are called plantains, distinguishing them from dessert bananaS. The fruits grow in clusters hanging from the top of the plant. Almost all modern edible seedless BANANAS come from two wild species of Musa acuminata and Musa balbisiana. The scientific names of most cultivated bananas are Musa acuminata, Musa balbisiana, and Musa X paradisiaca, depending on their genomic constitution.

Содержание файла bananas1.txt после успешного завершения программы следующее:

5

В случае, если содержание файла bananas2.txt следующее:

In the past, there was a hoax that some countries wanted to ban ananas (also known as pineapple) because it was less delicious than bananas but fortunately, this is not true.

Содержание файла bananas2.txt после успешного завершения программы следующее:

2

Comment

Названия вступительного файла может быть любым.

Task 2: Every Second Word

Напишите программу every_second.c, которая на основе исходного файла создаст новый так, что во второй файл будет записано каждое второе слово, считанное из первого файла между словами START и STOP. Названия файлов указываются как два аргумента программы. Словом считается каждая правильная последовательность символов, отделённая пробелом.

Запись слов (каждого второго) начинается после того, как во вступительном файле найдётся слово START. Слова (каждое второе) перестают записываться в файл после нахождения слова STOP.

Comment

Слова в файле при записи должны быть отделены друг от друга пробелом.

Comment

В целой программе при записи из файла в файл регистр имеет значение.

В рамках программы не разрешается использование каких-либо библиотечных функций (strlen(), strcpy(), strcmp() и т.д.). Разрешается использовать следующие 4 функции:

  • fopen() для инициализации работы с файлом
  • fclose() для завершения работы с файлом
  • fgetc() для чтения из фала
  • fputc() для записи в файл

Программа будет принимать два аргумента:

  • первым из аргументов будет название файла на входе
  • вторым аргументом будет название файла для записи

Пример использования программы может выглядеть следующим образом. Текст, выделенный жирным шрифтом будет представлять ввод от пользователя. Рядок, начинающийся символом '$' будет представлять командную строку.

$ ls
every_second input.txt
$ ./every_second input.txt output.txt
$ ls
every_second input.txt output.txt

После успешного завершения программы в директории должен появиться созданный файл. В случае, если содержание файла input.txt следующее:

Hello start START Hello Kitty, say, how are you doing today? STOP

Содержание файла output.txt после успешного завершения программы следующее:

Kitty, how you today?

Comment

Названия файлов, указываемые в аргументах могут называться по-разному.

Minimal Requirements to Succeed

  • Проект должен быть сдан и загружен в репозиторий git.kpi.fei.tuke.sk (см. ниже).
  • Во время компиляции проекта не должна возникнуть ни одна ошибка! Проект будет собираться с помощью gcc со следующими параметрами:
gcc -std=c11 -Werror -Wall -lm 
  • В вашей реализации не могут использоваться глобальные переменные.
  • В вашей реализации не могут использоваться другие библиотечные функции, кроме 4 разрешённых!

Project Submission

Задание нужно сдать до 16.12.2018. Последние тесты будут запущены в полночь этой даты.

Задание сдаётся с помощью системы контроля версий Git на сервере git.kpi.fei.tuke.sk.

Название вашего проекта должно быть точно в формате: zap-2018.

Сохраните иерархию файлов и директорий:

.
├── ps9
│   ├── count_words.c
│   ├── every_second.c
└── README

Значение отдельных файлов:

  • README или README.md - файл, в котором указывается группа, которую вы посещаете на практиках, должна быть строго в формате:
GROUP : C1
  • /ps9/count_words.c - Код решения первого задания - Посчитай слова.
  • /ps9/every_second.c - Код решения второго задания - Каждое второе слово.

Warning

Важно помнить, что в проекте должны находиться все нужные файлы, при этом сохраняю указанную иерархию. Если какой-то из файлов не будет найден или находится не в том месте, это будет считаться ошибкой!

Warning

Названия файлов README или README.md чувствительны к регистру в названии

Comment

В случае, если в проекте будут найдены другие файлы, ошибкой это считаться не будет.

Assessment and Testing

За задание можно получить max. 8 баллов, Из них максимально 4 балла за первое задание и 4 за второе. Количество баллов будет зависеть от результатов тестов, будут проверяться:

  • Иерархия файлов (находятся ли в репозитории все нужные файлы).
  • Функционал вашей реализации.

Сборка будет осуществляться с помощью компилятора gcc со следующими параметрами:

gcc -std=c11 -Werror -Wall -lm

Ошибкой будет считаться:

  • Использование глобальной переменной.
  • Если в вашей реализации будут использованы функции, отличный от 4 разрешённых.
  • Ошибки во время компиляции (предупреждения трактуются как ошибки).
  • Если ваша реализация не пройдёт каким-то из тестов.

Тестирование проектов будет проходить каждые 3 часа, а именно: 0300, 0600, 0900, 1200, 1500, 1800, 2100 и 2400.

Проект будет проверен на плагиат. Соблюдайте этический кодекс! В случае выявления того факта, что вы сдали не ваше задание, вы рискуете быть исключенным с предмета.