25
Introduction to Systems Programming (CS 0449) •C Preprocessing •Makefile •File I/O

Introduction to Systems Programming (CS 0449)

Embed Size (px)

DESCRIPTION

Introduction to Systems Programming (CS 0449). C Preprocessing Makefile File I/O. C Preprocessor. Modifies C code "to save typing" Define constants Define macros Include files Other parameters (time of compilation...). Preprocessor constants. Define a symbolic constant like so - PowerPoint PPT Presentation

Citation preview

Page 1: Introduction to Systems Programming (CS 0449)

Introduction to Systems Programming(CS 0449)

•C Preprocessing

•Makefile

•File I/O

Page 2: Introduction to Systems Programming (CS 0449)

C Preprocessor

• Modifies C code "to save typing"– Define constants– Define macros– Include files– Other parameters (time of compilation...)

Page 3: Introduction to Systems Programming (CS 0449)

Preprocessor constants

Define a symbolic constant like so

#define PI 3.141526

Better version

#define PI ( 3.141526 )

Use the symbolic constant

circle_length = 2 * PI * radius ;

Page 4: Introduction to Systems Programming (CS 0449)

Preprocessor constants (2)Check if constant defined ( #ifdef )#define VERBOSE. . .#ifdef VERBOSE

printf("I am extremely glad to see you !\n");#else

printf("Hi !\n");#endif

#pragma – this directive is for inserting compiler-dependent commands into a file.

Page 5: Introduction to Systems Programming (CS 0449)

Preprocessor MacrosParameterized Macros:Similar to function calls. Symbolic parameters !

#define SQUARE( x ) x * x

Better version:#define SQUARE( x ) ((x) * (x))

Usage:What will be the output for each version?int xx = SQUARE ( 1 + 2 + 3 ); (1+2+3*1+2+3) =???

printf( " x = %d \n", x ); is x=11?, or is it, x=36?

How do you fix it to generate 36? ((1+2+3) * (1+2+3))

Page 6: Introduction to Systems Programming (CS 0449)

Including files

• Used to include header files

• Can be used to include any file

• Beware of including header files twice

#include "MyFileName.c"

Page 7: Introduction to Systems Programming (CS 0449)

Header files

• Usually define function prototypes, user defined types and global variables.

• Avoid including twiceint x; /* included from myHeader.h */int x; /* included from myHeader.h */

• Standard header file header#ifndef MyHeaderFile_H#define MyHeaderFile_H... /* header file contents goes here */#endif

Page 8: Introduction to Systems Programming (CS 0449)

/* example.c */#include <stdio.h>#define ONE 1

main(){if(ONE != 1)

return 0;printf("The answer is %d.\n", myfunc(2,6) );

}

myfunc( int a, int b){

int i = ONE, j = ONE;for( ; i <= b; ++i) j = j * a;

return j;}

See this Example

Page 9: Introduction to Systems Programming (CS 0449)

Makefile

• Script file to automate program compilation and linking (making)1. Write the "makefile"2. Write your programs3. Run "make" or "make -f makefile"

• Makefile is a list of rules and commands

http://www.gnu.org/software/make/

Page 10: Introduction to Systems Programming (CS 0449)

Makefile

• Comments start with "#"# This is a makefile for Hello World application

• Variable definitions, usually in capital lettersCC = m68k-palmos-gcc

• Main target definitionall: hello1.prc

• Dependency definitions%.o: %.c

$(CC) $(CFLAGS) -c $< -o $@

Page 11: Introduction to Systems Programming (CS 0449)

HelloWorld Makefile (1)#This file contains information used by a program called make to#automate building the program

APP = hello1APPID = LFh1RCP = hello.rcpPRC = hello1.prcSRC = helloMain.c

CC = m68k-palmos-gccPILRC = pilrcOBJRES = m68k-palmos-obj-resBUILDPRC = build-prcCFLAGS = -g

Page 12: Introduction to Systems Programming (CS 0449)

HelloWorld Makefile (2)all: $(PRC)

$(PRC): grc.stamp bin.stamp;

$(BUILDPRC) $(PRC) $(APP) $(APPID) *.grc *.bin

ls -l *.prc

grc.stamp: $(APP)

$(OBJRES) $(APP)

touch $@

$(APP): $(SRC:.c=.o)

$(CC) $(CFLAGS) $^ -o $@

Page 13: Introduction to Systems Programming (CS 0449)

HelloWorld Makefile (3)bin.stamp: $(RCP)

$(PILRC) $^ $(BINDIR)touch $@

%.o: %.c$(CC) $(CFLAGS) -c $< -o $@

depend dep:$(CC) -M $(SRC) > .dependencies

clean:rm -rf *.o $(APP) *.bin *.grc *.stamp *~

veryclean: cleanrm -rf *.prc *.bak

Page 14: Introduction to Systems Programming (CS 0449)

Command Line Arguments/* MyProg.c */int main ( int argc , char *argv[] ){ ...

> myProg one two three

argc = 4argv[0] = "myProg"argv[1] = "one"argv[2] = "two"argv[3] = "three“argv[4] = NULL

Page 15: Introduction to Systems Programming (CS 0449)

Introduction to Systems Programming(CS 0449)

File Input / Output

Ch.11 Deitel & Deitel book

Page 16: Introduction to Systems Programming (CS 0449)

What is a File

• A file is a collection of related data

• "C" treats files as a series of bytes

• Basic library routines for file I/O #include <stdio.h>

Page 17: Introduction to Systems Programming (CS 0449)

Basics About Files

• Files must be opened and closed#include <stdio.h>. . .FILE * myFile; myFile = fopen ("C:\\data\\myfile.txt", "r"); // Name, Mode (r: read)if ( myFile == NULL ){ // (w: write)

/* Could not open the file */...

}. . .fclose ( myFile );

Note: status = fclose(file-variable)

status = 0 if file closed successfully- Error otherwise.

Page 18: Introduction to Systems Programming (CS 0449)

End-line Character

• Teletype Model 33 (long time ago...) used 2 characters at the end of line.– RETURN character– LINE FEED character

• Computer age– UNIX: LINE FEED at the end of line: "\n"– MS-DOS/Windows: both characters: "\n\r"– Apple: RETURN at the end of line: "\r"

Page 19: Introduction to Systems Programming (CS 0449)

File Types

• Text (ASCII) files

• Binary files

• Special (device) files

stdin - standard input (open for reading)

stdout - standard output (open for writing)

stderr - standard error (open for writing)

Page 20: Introduction to Systems Programming (CS 0449)

Operations with Files

• Reading (r)– sequential– random

• Writing (w)– sequential– random– appending (a)

• fopen() revisitedFILE *fOut;

fOut = fopen("c:\\data\\log.txt", "w" );

Page 21: Introduction to Systems Programming (CS 0449)

Useful File I/O Functions

• fopen(), fclose() -- open/close files• fprintf ( myFile, "format...", ...) -- formatted

I/O• fscanf ( myFile, "format...", ...)• fgets(), fputs() -- for line I/O• fgetc(), fputc() -- for character I/O

• feof() -- end of file detection, when reading

Page 22: Introduction to Systems Programming (CS 0449)

Binary and Random I/O

• Binary I/OreadSize = fread(dataPtr, 1, size, myFile);

//size of data read, if < size then encountered an error.

writeSize = fwrite(dataPtr, 1, size, myFile);

• Positioning for random I/Ofseek(myFile, 0, SEEK_SET);

fseek(myFile, 10, SEEK_CUR);

fseek(myFile, 0, SEEK_END);

Page 23: Introduction to Systems Programming (CS 0449)

Buffered v.s. Unbuffered I/O

//no immediate write to file, instead buffer data and then flush after program finished

• Buffered I/O may improve performance• Buffered I/O is with f...() functions

– fopen(), fwrite()

• Unbuffered I/O– open(), write()

Page 24: Introduction to Systems Programming (CS 0449)

Streams v.s. Records

• Stream - a file interpreted as a stream of bytes

• Record set - a file interpreted as a set of records, structures– The structures can be of the same size, or– each record can be of different size

Page 25: Introduction to Systems Programming (CS 0449)

Example: En/De-Crypterint main ( int argc, char * argv[] ) {FILE *in, *out;in = fopen ( argv[1], "rb");out = fopen ( argv[2], "wb");if ( ! in | | ! out ){

printf( "Error opening files ! \n" );return -1;

}while( ! feof ( in ) ){

ch = fgetc ( in );fputc ( (ch ^ 0xFF) , out ); //UTF-16 vs UTF-8 (Unicode Byte Order mark)

} //Unicode Transformation Formatreturn 0;

}