1 / 25

Introduction to Systems Programming (CS 0449)

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

joel-foster
Download Presentation

Introduction to Systems Programming (CS 0449)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introduction to Systems Programming(CS 0449) C Preprocessing Makefile File I/O

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

  3. 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 ;

  4. 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.

  5. 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))

  6. Including files • Used to include header files • Can be used to include any file • Beware of including header files twice #include "MyFileName.c"

  7. 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

  8. /* 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

  9. 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/

  10. 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 $@

  11. 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

  12. 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 $@

  13. 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

  14. 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

  15. Introduction to Systems Programming(CS 0449) File Input / Output Ch.11 Deitel & Deitel book

  16. 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>

  17. 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.

  18. 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"

  19. 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)

  20. Operations with Files • Writing (w) • sequential • random • appending (a) • Reading (r) • sequential • random • fopen() revisited FILE *fOut; fOut = fopen("c:\\data\\log.txt", "w" );

  21. 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

  22. 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);

  23. 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()

  24. 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

  25. 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; }

More Related