+ All Categories
Home > Education > KIERAN C WOOT WOOT 1

KIERAN C WOOT WOOT 1

Date post: 25-May-2015
Category:
Upload: kieran-ramnarine
View: 175 times
Download: 5 times
Share this document with a friend
Popular Tags:
27
06/16/22 Course material created by D. Woit 1 CPS 393 Introduction to Unix and C START OF WEEK 10 (C-4)
Transcript
Page 1: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 1

CPS 393Introduction to Unix and C

START OF WEEK 10 (C-4)

Page 2: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 2

Command line Processing • main is a function--so OS can pass arguments to it using

– Argument Vector, and – Argument Count

• int main(int argc, char *argv[]) • suppose • -make executable cla from cla.c: gcc -o cla cla.c • -and execute as: cla abc "de f" 74• -then inside cla.c:• argc is 4 // # args + 1 (#elts in argv)• argv[0] is "cla" // program name• argv[1] is "abc" // argument 1• argv[2] is "de f" // argument 2• argv[3] is "74" // argument 3

Page 3: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 3

Command line Processing • Program could print its COMMAND LINE

ARGUMENTS as follows:• int main (int argc, char *argv[]) {• int i; • for (i=1; i<argc; i++) • printf("command line argument %d is: %s\n", i,

argv[i]);• printf("Name of program is: %s\n", argv[0]);• exit(0); • }

Page 4: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 4

• /*Source: suma.c• Purpose: to sum the integers supplied• on the command line• Input: any number of integers in command line• Output: the sum of the inputted numbers• */• #include <stdio.h>• #include <stdlib.h>• int main (int argc, char *argv[]) {• int i, /*for loop index*/• sum=0; /*the sum of the arguments*/• • for (i=1; i<argc; i++) {• sum = sum + atoi(argv[i]);• }• printf("Sum of the %d integers is %d\n", argc-1, sum);• exit(0); • }• HMWK: Fix suma.c so that it checks for good integer input

Page 5: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 5

• /*Source: cml2.c• Purpose: print max of 2 int arguments• */• #define GoodInput 0• #define BadInput 1• #include <stdio.h>• int main (int argc, char *argv[]) {• • if (argc != 3 ) {• fprintf(stderr, "Usage: %s int1 int2\n", argv[0]);• exit(BadInput);• }• if (atoi (argv[1]) > atoi (argv[2]) )• fprintf(stdout, "%s\n", argv[1]);• else fprintf(stdout, "%s\n", argv[2]);• exit(GoodInput);• }• Note that functions strtof/strtod etc convert string to float/double etc• Also as: printf("%d\n", ( atoi(argv[2])>atoi(argv[1]) ) ? atoi(argv[2]):

atoi(argv[1]));

Page 6: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 6

File I/O • already used fprintf/fputs to print to FILE stdout, stderr• fprintf(stderr, "bad input: %d\n", x);• Others: • fscanf (fp, str, length) • fgetc (fp); • fputc (ch, fp)• fgets (str, length, fp); • fputs (str, fp);

– fp is a pointer to structure of type FILE (we still did not learn this)– FILE *fp, *fopen();– It is returned after fopen() system call to open the file, see next

slide.

Page 7: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 7

File I/O• Open file named myfile for

reading:• FILE *fp; // FILE in

stdio.h• if ( (fp =

fopen("myfile","r")) == NULL ) {

• fprintf(stderr,"fopen: Error opening file\n");

• exit(1); • }• fscanf(fp, "%d", &i);

• Mode• ----• r open text file for read• w open text file for write • a append to text file• r+ open text file for r/w• w+ create t.f. for r/w • a+ append or create for

r/w• Note: w & w+: if file not

exist, created• if it exists, it is destroyed

& new created

Page 8: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 8

Closing a file

• fclose(fp); 0 if successful

• EOF if not• (exit *should* close all files before pgm termination).• int fgetc(fp); returns: char read if succ (cast to int)• EOF otherwise• int fputc(ch,fp); returns: char written if succ (cast to int)• EOF otherwise

Page 9: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 9

Example• /*Source cio.c• Purpose: write a string to file myfile• */• #include <stdio.h>• #include <stdlib.h>• #define GOOD 0• #define BAD 1• int main(void) {• char str[40] = "String to write onto disk";• FILE *fp;• char ch, *p;• if ((fp = fopen("myfile","w"))==NULL) {• fprintf(stderr,"fopen: Cannot open file\n");• exit(BAD); • }

Page 10: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 10

• p=str;• while (*p) // why contents of the location pointed by p is not ‘\0’• if (fputc(*p++,fp)==EOF) {• fprintf(stderr,"fputc: Error writing file\n");• fclose(fp); /* close the file*/• exit(BAD);• }• fclose(fp); /*good form*/• exit(GOOD);• }

Page 11: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 11

Example • /*Source: cio2.c• Purpose: display contents

of myfile on stdout• */• #include <stdio.h>• #include <stdlib.h>• #define GOOD 0• #define BAD 1• int main(void) {• FILE *fp;• int ch;

• • if ((fp=fopen("myfile",

"r"))==NULL) {• fprintf(stderr,"fopen:

Cannot open file\n");• exit(BAD);• }• while (( ch = fgetc(fp)) !=

EOF)• fputc(ch,stdout);• fclose(fp);• exit(GOOD);• }

Page 12: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 12

• HMWK:

• Modify cio2.c to turn it into a simple version of unix utility "cat". If no cmd-line input, prints stdin on stdout. If cmd-line inputs (files), print each on stdout

Page 13: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 13

• /*Source: copy.c• Purpose: copy file f1 to file f2• Usage: copy f1 f2• */• #include <stdio.h>• #include <stdlib.h>• #include <string.h>• #define GOOD 0• #define BAD 1• int main (int argc, char *argv[]) {• FILE *f1, *f2;• int ch;

• if (argc != 3) {• fprintf(stderr, "Usage: %s <source> <destination>\n",argv[0]);• exit(BAD);• }

Page 14: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 14

• if ((f1=fopen(argv[1],"r"))==NULL) {• fprintf(stderr, "Cannot open %s\n",argv[1]);• exit(BAD);• }• if ((f2=fopen(argv[2],"w"))==NULL) {• fprintf(stderr, "Cannot open %s\n",argv[2]);• exit(BAD);• }• while ((ch=fgetc(f1)) != EOF) • fputc(ch,f2);• fclose(f1); fclose(f2);• exit(GOOD);• }

Page 15: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 15

file i/o• fgetc() returns EOF if• 1) error in reading• 2) hits EndOfFile• can test for these separately• feof(fp) non-0 if at EOF• 0 otherwise• ferror(fp) non-0 if error reading file• 0 otherwise

• while (!feof(f1)) {• ch=fgetc(f1);• if (ferror(f1)) {• fprintf(stderr, "Error

reading ...• exit(BAD);• }• if (!feof(f1)) fputc(ch,f2);• if (ferror(f2)) {• fprintf(stderr, "Error

writing ...• exit(BAD);• }

Page 16: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 16

• fgets(str, length, fp);• gets chars from FILE fp

and stores them• in array str, until• 1. '\n' read (and

transfered to s)• 2. (length-1) chars have

been read, or• 3. EOF• returns ptr to str if

successful• NULL ptr otws

• Note: fp could be stdin • the file read pointer

advanced "length-1" chars in the file. e.g., • fgets(X,3,f1); • fgets(Y,3,f1); for file with• 12345• abcde• will put "12" in X and "34" in

Y•• fputs(str,fp)• writes str to "file" ptd to by

fp• returns EOF if error;

positive int otws

Page 17: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 17

HMWK • 1. Rewrite copy.c using fgets, fputs, feof and ferror• assuming max line length in file is 128 chars.

• HMWK:• 1. Write a program named prt.c that reads text from• stdin until EOF and prints the number of lines and/or• characters that were read in. The program takes• one command line argument, which is l or c or b.• If the argument is l, the program prints the• number of lines, if c, the number of characters,• and if b, it prints the number of both lines and chars.

Page 18: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 18

HMWK • 2. Re-write program prt.c above• except this time, the program takes 2 arguments, • the second argument being the name of a file from • which to read the text. Perform *full* error checking.• 3. Re-write the above prt.c so that any number of• files are processed (number of chars/lines printed• for EACH, in order processed.)• 4. Use fscanf and fprintf to read a file with 2 columns of • integers, such as:• 2 4• 7 9• 10 6• and write the sum of each line to another file, e.g,• 6• 16• 16• The file names are given on the command line

Page 19: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 19

perror • You could also use function perror (print error) instead• of fprintf(stderr...);• When any system or library function is called *and fails*, its

return code (integer) is put in a system variable that perror can access. (clobbered with each failure).

• perror translates the integer to an (human understandable) phrase and prints on stderr, prefixed by its string argument

• e.g.,• FILE *fp;• if ( (fp = fopen("myfile","r")) == NULL ) {• perror("fopen"); • exit(1); • }

Page 20: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 20

perror • if "myfile" did not exist, stderr gets:• fopen: No such file or directory• (most of the built-in C functions use perror)• FYI: All the error codes are defined in /usr/include/asm-

generic/errno.h• This C function perror in section 3 of man pages (man

3 perror)•

Page 21: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 21

Structures• Just as we can group items of same type into arrays,• We can group items of dissimilar types into: structures• struct s-name { • type item1;• type item2;• . . .• type itemN;• } ;

Page 22: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 22

Structures• e.g., a struct to describe cars (in struct1.c)• struct car {• char make[40];• char model[40];• unsigned int year;• float price;• } ;• Then we can declare various variables of type struct car.

• struct car woit, chan1, chan2; //3 cars

Page 23: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 23

• Assign woit's car:• strcpy(woit.make, "Ferrari");• strcpy(woit.model, "F149");• woit.year = 2012;• woit.price = 155000.00;

• Read in chan1's car:• scanf("%s", chan1.make); //Porsche • gets(chan1.model); //Carrera • scanf("%u %f", &chan1.year, &chan1.price); //2013

440000

• Print woit's car's make:• printf("%s",woit.make); //prints Ferrari• printf("%c",woit.make[4]); //prints what?

Page 24: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 24

Typedefs

• give your own name to any data type

• typedef short int Sint;• int i;• Sint j,k;

Page 25: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 25

Typedefs for structures

• struct car {• char make[40];• char model[40];• unsigned int year;• float price;• } chan1 ;

//chan1 is a variable like woit and chan2

• struct car woit;• struct car chan2;

• typedef struct {• char make[40];• char model[40];• unsigned int year;• float price;• } car; //car is a

new datatype (such as Sint above)

• car woit;• car chan1, chan2;• see example cars.c

Page 26: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 26

Arrays of structures • car (struct car) is now a datatype, therefore, we can create

an array of cars• struct car chan[4]; /*if no typedef used*/• or• car chan[4]; /*if typedef used*/• How do we use arrays of structures?• chan's 0th car: chan[0].year = 1932;• chan's 3rd car: chan[3].price = 52399.99;• sizeof(struct car); /*no typedef*/• or• sizeof(car); /*typedef*/ returns size in bytes• See example arraycars.c

Page 27: KIERAN C WOOT WOOT 1

04/12/23 Course material created by D. Woit 27

HMWK: • Write a program that reads an input file such as:• 1 5• 2 -4• -3 9• 8 2• Each line of the file contains a "complex number".• Assume at most MAX=100 numbers are given. • The program must create a structure for a complex number, and then

store all the complex numbers in an array. (You must have an array of structures.)

• Then your program should loop through the array from end to front, and print out the complex numbers in it. E.g., your output should

• look like• 8 + 2i• -3 + 9i• 2 + -4i• 1 + 5i• on stdout.


Recommended