250 likes | 375 Views
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
E N D
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 #define PI 3.141526 Better version #define PI ( 3.141526 ) Use the symbolic constant circle_length = 2 * PI * radius ;
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.
Preprocessor Macros Parameterized 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 x x = 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))
Including files • Used to include header files • Can be used to include any file • Beware of including header files twice #include "MyFileName.c"
Header files • Usually define function prototypes, user defined types and global variables. • Avoid including twice int 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
/* 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
Makefile • Script file to automate program compilation and linking (making) 1. Write the "makefile" 2. Write your programs 3. Run "make" or "make -f makefile" • Makefile is a list of rules and commands http://www.gnu.org/software/make/
Makefile • Comments start with "#" # This is a makefile for Hello World application • Variable definitions, usually in capital letters CC = m68k-palmos-gcc • Main target definition all: hello1.prc • Dependency definitions %.o: %.c $(CC) $(CFLAGS) -c $< -o $@
HelloWorld Makefile (1) #This file contains information used by a program called make to #automate building the program APP = hello1 APPID = LFh1 RCP = hello.rcp PRC = hello1.prc SRC = helloMain.c CC = m68k-palmos-gcc PILRC = pilrc OBJRES = m68k-palmos-obj-res BUILDPRC = build-prc CFLAGS = -g
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 $@
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: clean rm -rf *.prc *.bak
Command Line Arguments /* MyProg.c */ int main ( int argc , char *argv[] ) { ... > myProg one two three argc = 4 argv[0] = "myProg" argv[1] = "one" argv[2] = "two" argv[3] = "three“ argv[4] = NULL
Introduction to Systems Programming(CS 0449) File Input / Output Ch.11 Deitel & Deitel book
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>
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.
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"
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)
Operations with Files • Writing (w) • sequential • random • appending (a) • Reading (r) • sequential • random • fopen() revisited FILE *fOut; fOut = fopen("c:\\data\\log.txt", "w" );
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
Binary and Random I/O • Binary I/O readSize = 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/O fseek(myFile, 0, SEEK_SET); fseek(myFile, 10, SEEK_CUR); fseek(myFile, 0, SEEK_END);
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()
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
Example: En/De-Crypter int 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 Format return 0; }