슬라이드 1 - Chonbuk
Download
Report
Transcript 슬라이드 1 - Chonbuk
Chap2. Fundamental File Processing Operations
Chapter Objectives
Describe the process of linking a logical file within a program to an actual physical file or device
Describe the procedures used to create, open, and close files
Introduce the C++ input and output classes
Explain the use of overloading in C++
Describe the procedures used for reading from and writing to files
Introduce the concept of position within a file and describe procedures for seeking different positions
Provide an introduction to the organization of the UNIX file systems
Present the UNIX view of a file, and describe UNIX file operations and commands based on this
view
Contents
2.1 Physical files and Logical files
2.2 Opening files
2.3 Closing files
2.4 Reading and Writing
2.5 Seeking
2.6 UNIX directory structure
2.7 Physical and Logical files
2.8 File-related header files
2.9 UNIX file system commands
Physical files and Logical files
Physical file
a file that actually exists on secondary storage
a file as known by OS and that appears in file directory
Logical file
a file as seen by program
allow program to describe operations to be performed on file not knowing what
physical file will be used
Connections bet. Physical files and Logical files
Main frame era: by Job Control Language
Unix and DOS era: by the instructions within the program (O/S system calls or parts of
PLs)
ex) select inp_file assign to “myfile.dat”
– inp_file: logical file, myfile.dat: physical file
Opening files
Two options
open existing file
create new file, deleting any existing contents in the physical file
ex) fd = open(filename, flags [pmode]);
fd: file descriptor
filename: physical file name
flags: O_APPEND, O_CREAT, O_EXCL, O_RDONLY, O_RDWR, O_TRUNC, O_WRONLY
pmode: in O_CREAT, pmode is required
protection mode
Opening files: Example
Pmode = 0751 = 111
101
001
{owner, group, world × read, write, execute}
fd = open(fname, O_RDWR|O_CREAT,0751)
fd = open(fname,O_RDWR|O_CREAT|O_TRUC,0751)
fd = open(fname, O_RDWR|O_CREAT|O_EXCL,0751)
Closing files
Files are closed automatically by the OS when a program terminate normally
CLOSE statement is needed only as protection against data loss in the event of program
interruption and to free up logical filenames for reuse
ex) close(fd); (fd : file descriptor)
Reading & Writing(1)
Input / Output operation
low-level system call (Unix)
– read(Source_file, Destination_addr, Size)
– write(Destination_file, Source_addr, Size)
C streams (in stdio.h)
– file = fopen(filename, type);
– fread, fget, fwrite, fput, fscanf, fprintf
Reading & Writing(2)
Input/Output operations(cont’d)
C++ stream classes (in iostream.h, fstream.h)
– fstream()
– fstream(char *fname, int mode);
– int open(char *fname, int mode);
– int read(unsigned char *dest_addr, int size);
– int write(unsigned char *source_addr, int size);
– modes: ios::in, ios::out, ios::nocreate, ios::noreplace, ios::binary
The File Listing Program Using C Streams
// list.cpp
// program using C streams to read characters from a
// file and write them to the terminal screen
#include <stdio.h>
main() {
char ch;
FILE * file; // pointer to file descriptor
char filename[20];
printf(“Enter the name of the file : “);
gets(filename);
file = fopen(filename, “r”);
while (fread(&ch, 1, 1, file) != 0)
fwrite(&ch, 1, 1, stdout);
fclose(file);
}
The File Listing Program Using C++ Stream Classes
// listcpp.cpp
// list contents of file using C++ stream classes
#include <iostream>
#include <fstream>
using namespace std;
Int main() {
char ch;
fstream file;
// declare unattached fstream
char filename[20];
cout << “Enter the name of the file : “;
cout.flush(); // force output
cin >> filename;
file.open(filename, ios::in);
file.unsetf(ios::skipws); // include write space in read
while(1){
file >> ch;
if (file.fail()) break;
cout << ch;
}
file.close();
return 0;
}
Reading & Writing(3)
Detecting the end of file
In C, fread() returns zero when reached the end of file
In C++, fstream::fail() return true if the previous operation on the stream failed
In Ada, end_of_file function is called before trying to read the next byte
Seeking
moving directly to a certain position in a file
lseek(Source_file, Offset, Origin) in Unix
Offset - the pointer moved from the start of the source_file
File is viewed as an array of byte in C
pos = fseek(file, byte_offset, origin)
origin – 0, 1, 2 (SEEK_SET, SEEK_CUR, SEEK_END)
In C++, An object of type fstream has two pointers
seekg(byte_offset, origin) moves the get pointer
seekp(byte_offset, origin) moves the put pointer
origin – ios::beg, ios::cur, ios::end
file.seekg(373, ios::beg), file.seekp(373, ios::beg)
UNIX Directory Structure
UNIX file system : tree organization
File : identified by its absolute value
ex) /usr/mydir/addr
‘.’ current directory, ‘..’ the parent of ‘.’
/ (root)
bin
usr
bin
adb
usr6
lib
lib
dev
mydir
cc yacc
console
kbd
libdf.a
libc.a
libm.a
addr
DF
TAPE
Physical and Logical files in UNIX
UNIX views both physical devices and disk files as file.
ex) Keyboard(STDIN), Console(STDOUT), Error-file(STDERR)
I/O redirection, pipes
Shortcuts for switching between standard I/O and regular file I/O
ex) list > myfile
/* I/O redirection */
ex) program1 | program2 /* pipe */
Unix File System
File-related header files
/usr/include
– In C,
stdio.h
– In C++, iostream and fstream
– In Unix, fcntl.h and file.h
Unix file system commands
cat, tail, cp, mv, rm
chmod, ls, mkdir, rmdir
File I/O in C
Low-level I/O
UNIX system calls
fd1 = open(filename1, rwmode);
fd2 = open(filename2, rwmode);
read(fd1, buf, n);
write(fd2, buf, n);
lseek(fd1, offset, origin);
close(fd1); close(fd2);
<stdio.h>
fp = fopen(s, mode)
c = getc(fp) /* get character; getchar() is getc(stdin) */
putc(c, fp)
ungetc(c, fp) /* put character back on input file fp; at most 1 char can be pushed back at one time */
scanf(fmt, a1, ....) /* read characters from stdin into a1, ... according to fmt. Each a i must be Sa pointer. Returns EOF or number of fields converted */
fscanf(fp, .....) /* read from file fp */
printf(fmt, a1, ....) /* format a1, ... according to fmt, print on stdout */
fprintf(fp, ....) /* print .... on file fp */
fgets(s, n, fp) /* read at most n characters into s from fp. Returns NULL at end of file */
fputs(s, fp) /* print string s on file fp */
fflush(fp) /* flush any buffered output on file fp */
fclose(fp) /* close file fp */
/* open file s; mode “r”, “w”, “a” for read, write, append (returns NULL for error) */
/* put character; putchar(c) is putc(c, stdout) */
File I/O in C++
#include <fstream.h>
File Stream: fstream, ifstream, ofstream
ex) ifstream f1(“input.fil”);
ofstream f2(“output.fil”, ios::out|ios::nocreat);
fstream f3(“inout.fil”, ios::in|ios::out);
f1.get(ch); f1.eof(); f2.put(ch); f2.bad();
f1.seekg(); f2.seekp();
f3.close();
<iostream>
class ios
class istream: virtual public ios
class ostream: virtual public ios
class iostream: public istream, public ostream
class hierarchy
Copy program in C++(1)
#include <iostream>
#include <fstream>
using namespace std;
void error(char *s, char *s2 = ““){
cerr << s << ‘ ‘ << s2 << ‘\n’;
exit(1);
}
int main(int argc, char *argv[])
{
if( argc != 3) error(“wrong number of arguments”);
ifstream src(argv[1]); //input file stream
if (!src) error(“cannot open input file”, argv[1]);
Copy program in C++(2)
ofstream dest(argv[2]); //output file stream
if(!dest) error(“cannot open output file”, argv[2]);
char ch;
while( src.get(ch) ) dest.put(ch);
if(!src.eof() || dest.bad())
error(“something strange happened”);
return 0;
}
File Functions
File functions we will develop from the primitive operations
Add - add a new record to a file
Delete - remove a record from a file
Read all records in key order
Read a record with specific key value
Update a record in a file
File reorganization