Assignment 4: A Little Language for Text File Statistics

In this assignment your task is to implement a small programming language that calculates statistics about text files. The C++ program you write will read and execute the commands from a text file called commands.txt.

Each command in commands.txt is written on a single line, and consists of two strings in this form:

command filename

There must be at least one space (and maybe more) between command and filename. Some of the lines might be blank, and those lines should be ignored.

There are three different commands: num_chars, num_lines, and num_words. They each cause messages to be printed to cout as follows:

  • num_chars filename prints a message to cout indicating the number of characters in filename.
  • num_lines filename prints a message to cout indicating the number of newlines ('\n' characters) in filename.
  • num_words filename prints a message to cout indicating the number of words in filename. A word is defined as the string that an input stream (such as cin) returns when reading a string value.

Case matters, and so, for instance, Num_chars is not a valid command name.

Sample Output

Here’s a sample commands.txt file:

num_lines output.log
num_chars story.txt
num_words story.txt
num_lines file_list.txt

Assuming your program is named a4, and that the files output.log, story.txt, and file_list.txt are in the same directory as a4, the correct output is this:

$ ./a4
output.log has 0 lines
story.txt has 42 characters
story.txt has 9 words
file_list.txt has 8 lines

The file output.log is an empty file.

The file story.txt contains this:

Once upon
a time
a princess ate an
apple.

Note that the character count for story.txt is 42. This includes the newline characters and spaces. There is one space character immediately after the word “an”.

The file file_list.txt contains this:

directory:
    index.html
    toc.html

logs:
    access.log
    errors.log
    sys.log

The exact files are contained in the folder a4_sample.zip.

Error Handling

An important part of this assignment is dealing with errors. In particular:

  • If commands.txt doesn’t exist in the same folder as your program, then stop the program and print a helpful error message indicating commands.txt couldn’t be found. Don’t use cmpt::error.

  • It’s possible that commands.txt could be empty. In that case, stop the program and print a friendly message such as “commands.txt is empty” and then end normally. Don’t use cmpt::error.

  • If a line begins with a string that is not a valid command, then print a friendlt and helpful error message saying that the command was not recognized (include the name of the unrecognized command in the error message). Don’t stop the program. Instead, skip the line with the invalid command and go on to the next line.

  • If the filename for a command does not name a file in the same directory as your program, then print a friendly and helpful error message such as “Cannot find file: filename” (of course, replace filename with the name of the file that wasn’t found). After the message is printed, the program should skip that line and go on to the next line. Don’t stop the program using cmpt::error.

  • If a line starts with a valid command, but has no filename, or more than one filename, then print a friendly and helpful error message. For example, both of these lines should cause errors:

    num_lines
    num_chars story.txt file_list.txt
    

    After the message is printed, the program should skip that line and go on to the next line. Don’t use cmpt::error.

  • There can be one, or more, spaces after a command. Also, extra whitespace characters are permitted before or after any of the lines in commands.txt. Whitespace characters include spaces, newlines (i.e. blank lines), tabs, etc. So, for example, this commands.txt file generates exactly the same output as the neatly-formatted one shown above:

    num_lines                 output.log
    
    
         num_chars story.txt
      num_words    story.txt
    
    num_lines   file_list.txt
    

    Note that the only spaces are allowed between a command and a file name. You cannot, for example, put a newline immediately after a command.

Required Functions

While there are no specific required functions for this assignment, we want to see that your program uses functions in a smart way.

Use functions to divide-up your program into logical chunks. Avoid long stretches of code; a good general rule of thumb is that a function should be no more than about 10 lines long.

Bonus Marks

You can earn up to 2 bonus marks for correctly implementing one, or both, of the following features:

  • (1 bonus mark) Allow //-style comments in commands.txt. They should work like C++’s //-style comments: everything after the // up to the end of the line is ignored. For example:

    // num_lines output.log
    num_chars story.txt     // print stats for
    num_words story.txt     // story.txt
    num_lines file_list.txt
    
  • (1 bonus mark) Allow more than 1 file name to appear after any command. Multiple names are separated by 1, or more, spaces. For example:

    num_chars story.txt file_list.txt
    

    This prints the same thing as these two separate commands:

    num_chars story.txt
    num_chars file_list.txt
    

    If you implement this feature, then it is no longer an error if a line contains more than one file name.

These features are optional: you can still get a 100% by implementing the rest of the assignment correctly.

Submission

Put your program in a single file called a4.cpp. It should #include, at most, these files: iostream, fstream, cmpt_error.h, and string. Do not #include any other files.

When it’s ready to be submitted, compress a4.cpp into a zip-file archive called a4_submit.zip by typing the following command in a Linux console window:

$ zip a4_submit.zip a4.cpp

Don’t type the $ — that’s the command prompt. Do not compress your program in any other way — only .zip please!

Include the name of the course (CMPT 130), the semester (Fall 2017), and your name and student number in comments at the top of the file.

If you received help from any other person, or book (such as the textbook), or website, etc., then you must cite this help in a comment at the top of your program. If you do not include such a comment, we will assume the program is entirely your own work. Not citing help (even if you accidentally forget) is considered academic dishonesty and will be dealt with seriously.