Introduction to Computer Programming (C language) - Chapter 9: File Processing - Võ Thị Ngọc Châu
Bạn đang xem 20 trang mẫu của tài liệu "Introduction to Computer Programming (C language) - Chapter 9: File Processing - Võ Thị Ngọc Châu", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- introduction_to_computer_programming_c_language_chapter_9_fi.pdf
Nội dung text: Introduction to Computer Programming (C language) - Chapter 9: File Processing - Võ Thị Ngọc Châu
- Ho Chi Minh City University of Technology Faculty of Computer Science and Engineering Chapter 9: File Processing Introduction to Computer Programming (C language) TS. Võ Thị Ngọc Châu (chauvtn@cse.hcmut.edu.vn, chauvtn@hcmut.edu.vn) 2017 – 2018, Semester 2
- Course Content C.1. Introduction to Computers and Programming C.2. C Program Structure and its Components C.3. Variables and Basic Data Types C.4. Selection Statements C.5. Repetition Statements C.6. Functions C.7. Arrays C.8. Pointers C.9. File Processing 2
- References [1] “C: How to Program”, 7th Ed. – Paul Deitel and Harvey Deitel, Prentice Hall, 2012. [2] “The C Programming Language”, 2nd Ed. – Brian W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988 and others, especially those on the Internet 3
- Content Introduction Declare files Open and close files Store and retrieve data from files Use macros Summary 4
- Recall – Chapter 3 and Chapter 8 Memory layout of a C program Higher address Command-line arguments and environment variables Local variables, arguments, Stack grown/shrunk with function calls Grown/shrunk with dynamic allocation and de-allocation Heap Uninitialized (static) global Uninitialized data Initialized to variables, static local variables .bss zero by exec Initialized (static) global variables, Initialized data Read from static local variables, constants .data program file Machine code, often read-only Code by exec .text Lower address bss = block started by symbol, better save space
- Introduction Data (input, output, supporting) in memory Temporary as lost when a program terminates !!! Can we have permanent data before and after program execution? Files on secondary storage devices (hard drives, CDs, DVDs, flash drives, ) 6
- Introduction Files on hard drives data1.txt data2.txt 7
- Introduction Figure 11.1. Data hierarchy [1], pp. 419 8
- Introduction C views each file as a sequential stream of bytes. Each file ends either with an end-of-file marker or at a specific byte number recorded in a system- maintained, administrative data structure. end-of-file: ctrl-z (Windows), ctrl-d (Linux/Mac OS X/Unix) When a file is opened, a stream is associated with the file. Streams provide communication channels between files and programs. Figure 11.2. C’s view of a file of n bytes [1], pp. 420 9
- Introduction C views each file as a sequential stream of bytes. Fixed-length records stored in a random-access file The exact location of a record relative to the beginning of the file Figure 11.10: C’s view of a random-access file [1], pp. 431 10
- Introduction Operations on files Create Open Read Write (write a new file, append an existing file) Close Access to files in C for processing Sequential access to a sequential stream of bytes Random access to a stream of fixed-size records 11
- Introduction The standard library: FILE *fopen(const char *filename, const char *mode) FILE *freopen(const char *filename, const char *mode, FILE *stream) int fclose(FILE *stream) size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) int fgetc(FILE *stream) char *fgets(char *str, int n, FILE *stream) int fscanf(FILE *stream, const char *format, ) size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) int fputc(int char, FILE *stream) int fputs(const char *str, FILE *stream) 12 int fprintf(FILE *stream, const char *format, )
- Declare files Each file communicated with C program via a stream controlled by a pointer of FILE identifier: a valid identifier for a pointer FILE* identifier; pointing to a file stream FILE: an object type suitable for storing FILE* pFile1; information for a file stream, defined in the standard library FILE* pFile2 = 0; FILE*: a pointer type of FILE type FILE* pFile3 = NULL; A file pointer will be associated with a file stream once a file is opened. 13
- Open and close files Open files FILE *fopen(const char *filename, const char *mode) Opens the file pointed to by filename using the given opening mode. pFile1 = fopen("Data.txt", "r"); Close files int fclose(FILE *stream) Closes the stream. All buffers are flushed. fclose(pFile1); 14
- Open and close files Open files Filename = "Data.txt" Located in the current directory Filename = ".\\Data\\Data.txt" Located in the sub-directory of the current directory Filename = " \\Data.txt" Located in the super-directory of the current directory Filename = "D:\\CS - Introduction to Computer Programming - CO1003 - Undergraduate course\\Code samples\\Data\\Data.txt" Located in the specified directory with the absolute path 15
- Open and close files File opening modes 16
- Store and retrieve data from files Store data into files (write) A sequence of bytes from memory to the file The file plays a role of stdout. Retrieve data from files (read) A sequence of bytes from the files to memory The file plays a role of stdin. What bytes? Read (file -> memory) Write (memory -> file) A char fgetc fputc A line of bytes fgets fputs Formatted bytes fscanf fprintf Bytes in the fread fwrite binary mode 17
- Store and retrieve data from files 18
- Store and retrieve data from files 19
- Store and retrieve data from files What bytes? Read (file -> memory) Write (memory -> file) A char fgetc fputc char aChar; aChar = fgetc(pFile1); fputc('a', pFile1); A line of bytes fgets fputs char aStr[50]; fgets(aStr, 50, pFile1); fputs("Today?", pFile1); Formatted bytes fscanf fprintf int anInt; fscanf(pFile1, "%d %c fprintf(pFile1, "%d %d char aChar; %f", &anInt, &aChar, %c %f", 10, anInt, aChar, float aFloat; &aFloat); aFloat); Bytes in the fread fwrite binary mode char buffer[50]; fread(buffer, fwrite(buffer, sizeof(int)+sizeof(char)+si strlen(buffer)+1, 1, zeof(float)+1, 5, pFile1); pFile1); 20
- Process the grades of each student Put them all togetherin a file for their averaged grades. 21
- Process the grades of each student in a file for their averaged grades. Put them all togetherWrite the resulting averaged grades into another file. 22
- Input data file Put them all together Output data file in the binary mode Output data file in the formatted mode 23
- Output data file in the binary mode Output data file in the formatted mode 24
- Use macros Macro An identifier in #define preprocessor directive #define identifier replacement-text identifier: a valid identifier scoped from its definition to the end of the file or to the #undef directive replacement-text: text on the line or longer text on many lines with a backslash (\) Considered as operations defined as symbols With no argument processed like a symbolic constant With arguments processed like an inline function . Arguments are substituted in the replacement text . The replacement text then replaces the identifier and argument list in the program 25
- Use macros #define identifier replacement-text User-defined macros Parentheses need using for correct value determination. 26
- Use macros #define identifier replacement-text #define CIRCUMFERENCE(radius) (2*PI*(radius)) r=1.5 CIRCUMFERENCE(r+1) = (2*PI*(r+1)) = 15.71 VS. #define CIRCUMFERENCE(radius) (2*PI*radius) r=1.5 CIRCUMFERENCE(r+1) = (2*PI*r+1) = 10.42 X 27
- Use macros #define identifier replacement-text #define DIAMETER(radius) ((radius) + (radius)) CIRCUMFERENCE = PI*DIAMETER(r+1) r=1.5 = PI*((r+1)+(r+1)) = 15.71 VS. #define DIAMETER(radius) (radius) + (radius) CIRCUMFERENCE = PI*DIAMETER(r+1) r=1.5 = PI*(r+1)+(r+1) = 10.35 X 28
- Use macros Conditional compilation up to macro definition control the execution of preprocessor directives and the compilation of program code #ifdef identifier //if identifier is defined, consider the following code #endif #ifdef identifier //if identifier is defined, consider the following code #else //else consider the following code #endif #ifdef identifier //if identifier is defined, consider the following code #elif constant-expression #endif #ifndef identifier //if identifier is not defined, consider the following code #endif #undef identifier //remove the definition of identifier 29
- Use macros – Conditional compilation Recall – Chapter 6 – Functions Header file: mynumber.h 30
- Use macros Many macros predefined in the standard library files FLT_MIN: the minimum finite floating-point value FLT_MAX: the maximum finite floating-point value INT_MIN: the minimum value for an int with 2 bytes INT_MAX: the maximum value for an int with 2 bytes LC_ALL: sets everything with the location specific settings LC_CTYPE: affects all the character functions with settings 31
- Use macros Many macros predefined in the standard library files The stdarg.h header defines a variable type va_list and three following macros which can be used to get the arguments in a function when the number of arguments are not known i.e. variable number of arguments. . void va_start(va_list ap, last_arg) . type va_arg(va_list ap, type) . void va_end(va_list ap) A function of variable arguments is defined with the ellipsis (, ) at the end of the parameter list. 32
- Use macros - va_list A type whose variable ap is used for holding information about the arguments void va_start(va_list ap, last_arg) The macro initializes ap variable to be used with the va_arg and va_end macros. The last_arg is the last known fixed argument being passed to the function i.e. the argument before the ellipsis. type va_arg(va_list ap, type) The macro retrieves the next argument in the parameter list of the function with type type. void va_end(va_list ap) The macro allows a function with variable arguments which used the va_start macro to return. If va_end is not called before returning from the function, the result is undefined. 33
- Use macros - Define the function isSubstring to check if a substring is contained by a list of given strings. 34
- Use macros - Variable ap is required to have an access to each argument in the argument list after this point. This macro is required to start the access to the argument list. This macro is required to have an access to an actual argument of type char* in the argument list. This macro is required to end the access to the argument list before the return of the function. 35
- Summary File processing in C Allows data permanency Performs with the standard functions in the library Open/Close Read/Write/Append Supports two access schemes Sequential access Random access 36
- Summary Macros in the #define preprocessor directive User-defined macros vs. Macros in the libraries Conditional compilation based on macro definitions Examples with macros in the for functions with the variable numbers of arguments 37
- Chapter 9: File Processing 38