1. Programming in C
Objectives
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
2. Programming in C
Differentiating 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
3. Programming in C
Difference 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
4. Programming in C
Practice: 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
5. Programming in C
Practice: 8.1 (Contd.)
Solution:
– A file descriptor is a non-negative integer.
Ver. 1.0 Slide 5 of 22
6. Programming in C
Uses 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
7. Programming in C
Working 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
8. Programming in C
The 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
9. Programming in C
The 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
10. Programming in C
The 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
11. Programming in C
The 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
12. Programming in C
Practice: 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
13. Programming in C
Practice: 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
14. Programming in C
Error 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
15. Programming in C
Error 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
16. Programming in C
Error 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
17. Programming in C
Using 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
18. Programming in C
The 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
19. Programming in C
The 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
20. Programming in C
The 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
21. Programming in C
Summary
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
22. Programming in C
Summary (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
Hinweis der Redaktion
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.