Introduction to Systems Programming (CS 0449) C Preprocessing Makefile File I/O.
-
Upload
junior-simmons -
Category
Documents
-
view
234 -
download
2
Transcript of 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 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))
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 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
/* 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 programs3. 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 lettersCC = m68k-palmos-gcc
• Main target definitionall: 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 = hello1APPID = LFh1RCP = hello.rcpPRC = hello1.prcSRC = helloMain.c
CC = m68k-palmos-gccPILRC = pilrcOBJRES = m68k-palmos-obj-resBUILDPRC = build-prcCFLAGS = -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: cleanrm -rf *.prc *.bak
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
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
• Reading (r)– sequential– random
• Writing (w)– sequential– random– appending (a)
• fopen() revisitedFILE *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/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);
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-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;
}