Begin the session by explaining the objectives of the session.
Give examples where low-level and I/O can be used.
Use this slide to test the student’s understanding on high-level and low-level I/O.
Give a scenario and ask the students which type of I/O they would use in the situation. Also, ask them to justify their answers.
Tell the students that the value returned by the open() function can be used to check whether a file has been opened successfully.
The close() function releases the resources occupied. It also flushes out the data from the streams before closing them.
If successful, the read() functions returns the number of characters read.
If successful, the write function returns the number of bytes written into the file. This number should be equal to the size parameter of the write function.
Use this slide to test the student’s understanding on low-level I/O functions.
Use this and the next slide to summarize the session.
Programming in CObjectives In this session, you will learn to: Differentiate between high-level and low-level input/output Work with low-level input/output functions Use random access in files Ver. 1.0 Slide 1 of 22
Programming in CDifferentiating Between High-Level and Low-Level Input/Output In C, files and devices can be accessed by using two groups of functions: High-level I/O or stream-level I/O Low-level I/O Ver. 1.0 Slide 2 of 22
Programming in CDifference Between High-level I/O and Low-level I/O High-level or Stream-level I/O: Is more flexible and convenient. Hides complexity from the programmer. Is slower. Low-level I/O: Provides direct access to files and devices. Is complex (buffer management is to be done by the programmer). Is faster. Uses a file descriptor to track the status of the file. Ver. 1.0 Slide 3 of 22
Programming in CPractice: 8.1 Which of the following statements is true? In C, there are many interfaces between a program and peripheral devices. A file descriptor is a non-negative integer. When you perform an operation on a file, the system uses the name of the file to identify it. Ver. 1.0 Slide 4 of 22
Programming in CPractice: 8.1 (Contd.) Solution: – A file descriptor is a non-negative integer. Ver. 1.0 Slide 5 of 22
Programming in CUses of Low-Level Input/Output Low-level I/O functions are used for: Accessing files and devices directly. Reading binary files in large chunks. Performing I/O operations quickly and efficiently. Ver. 1.0 Slide 6 of 22
Programming in CWorking with Low-Level Input/Output Functions The low-level I/O system in C provides functions that can be used to access files and devices. The basic low-level I/O functions are: open() close() read() write() Ver. 1.0 Slide 7 of 22
Programming in CThe open() Function • The open() function: Is used to open an existing file or create a new file. Returns a file descriptor for the file name passed to it. Has the following syntax: int open(char *filename, int flags, int perms ); Ver. 1.0 Slide 8 of 22
Programming in CThe close() Function • The close() function: – Closes the file that was opened using the open() function. – Takes the file descriptor as a parameter to close the file. – Returns 0 on success and -1 in case of an error. – Has the following syntax: int close(int filedes); Ver. 1.0 Slide 9 of 22
Programming in CThe read() function • The read() function: Reads data from a file. Starts reading a file from the current file position. Has the following syntax: int read (int filedes, char *buffer, int size); Ver. 1.0 Slide 10 of 22
Programming in CThe write() function • The write() function: Enables a user to write contents to a file. Has the following syntax: int write (int filedes, char *buffer, int size); Ver. 1.0 Slide 11 of 22
Programming in CPractice: 8.2 1. Which of the following statements is true? – At end-of-file, if a function is called repeatedly, it will give error. – In a read() function, the value of zero indicates end-of-file. • What will happen if you do not call the write() function in a loop? Ver. 1.0 Slide 12 of 22
Programming in CPractice: 8.2 (Contd.) Solution: – In a read() function, the value of zero indicates end-of-file. – If you do not call write() function in a loop then the entire data would not be written. Ver. 1.0 Slide 13 of 22
Programming in CError Handling Error Handling: – Some of the low-level I/O functions return error flags when they fail to perform a specified task. – You can find these types of errors using a variable, errno. – The following table lists some values of errno that are common to the open(), close(), read(), and write() functions. errno values Description EACCES Specifies that the program has failed to access one of the directories in the file. ENAMETOOLONG Indicates that the file name is too long. ENOSPC Specifies that the disc is out of space and the file can not be created. EIO Specifies that there was a hardware error. EBADF Specifies that the file descriptor passed to read, write, or close the file is invalid. Ver. 1.0 Slide 14 of 22
Programming in CError Handling (Contd.) – There are certain errno values that are specific to the open() function, which are shown with the help of the following table. errno values Description EEXIST Specifies that if File already exists, and O_CREAT and O_EXCL are set, then opening the file would conflict with the existing file and the file will not open. EISDIR Specifies that the file is actually a directory. ENOENT Specifies that some of the file components do not exist. EMFILE Specifies that too many files are open. EROFS Specifies that the file is on a read only systembut either one of the write permissions O_WRONLY, O_RDWR, or O_TRUNC is set. Ver. 1.0 Slide 15 of 22
Programming in CError Handling (Contd.) – There are certain errno values that are specific to the write() function, which are shown with the help of the following table. errno values Description EFBIG Specifies that the file will become too large if the data is written on it. EINTR Specifies that the write operation is temporarily interrupted. Ver. 1.0 Slide 16 of 22
Programming in CUsing Random Access Seek in Files • The read and write operations on files are usually sequential in nature. • Random access permits non-sequential file access so that a file can be read or written out of sequence. • Random access in low-level file routines is performed using the lseek() function. Ver. 1.0 Slide 17 of 22
Programming in CThe lseek() Function • The lseek() function: Returns the file position, as measured in bytes from the beginning of the file. Has the following syntax: long lseek (int filedes, long offset, int origin); Ver. 1.0 Slide 18 of 22
Programming in CThe lseek() Function (Contd.) • The following table lists the various values of the third parameter (origin). Values for origin Description SEEK_SET or 0 Specifies that the offset is relative to the beginning of the file. The offset can only be positive. SEEK_CUR or 1 Specifies that the offset is relative to the current position. The offset can be positive or negative. SEEK_END or 2 Specifies that the offset is relative to the end of the file. The offset can be positive or negative. Ver. 1.0 Slide 19 of 22
Programming in CThe lseek() Function (Contd.) The following table lists some instructions for moving to the end or beginning of a file. Instruction Function used To get to the end of a file lseek(filedes,0,2); To return to the beginning of a file lseek(filedes,0,0); Ver. 1.0 Slide 20 of 22
Programming in CSummary In this session, you learned that: – In C, files and devices can be accessed by using high-level I/O or stream-level I/O and low-level I/O. – Low-level I/O functions are those, which provide direct access to files and peripheral devices. – A file descriptor is a non-negative integer, which is returned by the open() function and is used in read() and write() functions. It tells about the permission to access the file. – Low-level input/output functions are used for the following purposes: • Accessing files and devices directly • Reading the binary files in large chunks • Performing I/O operations quickly and efficiently – The open() function is used to open or create a file. Ver. 1.0 Slide 21 of 22
Programming in CSummary (Contd.) – The close() function is used for closing the file. – The read() function reads the existing file up to specified size and stores it into a character array. – The write() function writes on the file taking input from a character array up to specified size. – Most of the low-level I/O functions throw errors during file handling. – errno is the variable that tells about the error occurred during a low-level I/O operation. – Files and devices can also be accessed randomly. – The lseek() function is used to place the file position to the desired place. – The lseek() function do not require to read or write the file for positioning it. Ver. 1.0 Slide 22 of 22