#9 저수준 파일 문자/문자열 읽고 쓰기 (실습)
byte stream을 저장하는 방식 write,read, pwrite, pread를 이용해서 데이터를 저장하고 읽어보자.
첫번째. 정보 쓰기
1. 기본 뼈대를 작성 해준다.
2. 이름과 나이를 저장하는 struct 를 선언한다.
3. 파라미터로 struct person 포인터를 받아오도록 하는 write_info 라는 API를 만든다.
open 함수
없으면 생성하고(O_CREAT) , 쓰기권한을 가지면서(O_WRONLY), 파일 뒷쪽에 APPEND 하게끔 해주고(O_APPEND) , 권한은 644로(0644) 설정해준 뒤, 예외처리 해준다.
write 함수
1. wirte() 함수에서는 첫번째 fd , 두번째 버퍼(사람정보p) , 세번째는 할당 메모리 를 선언 해준다.
write(fd, p, sizeof(struct person));
2. write API 의 return 값은 ssize_t 이기 때문에, 아래처럼 선언 후, ret을 정의 해준 뒤, 예외처리를 해준다.
ssize_t ret;
3. 예외처리는 1. 완전히 실패하는 경우 2. 일부분만 써지는 경우로 나누어서 예외처리해준다.
close API를 통해 열린파일을 닫아준다.
4. main 함수에서 가변길이 배열 선언 후, write_info 함수를 호출해준다.
두명을 저장해주었으니, write_info를 두번 호출 해준다. (포인터로 넘기기 때문에 주소로 넘겨준다.)
두번째. 정보 읽기
5. 파일에서 정보를 읽어서 화면에 출력하는 함수인 dump_info 를 작성해보자.
파일을 열어서 struct person 만큼 데이터를 읽어서 화면에 출력하면된다.
open함수
생성하는게 아니기 때문에 O_CREAT 가 필요하지않고, O_WRONLY 대신 O_RDONLY 가 필요하며, O_APPEND 또한 필요하지않고, 권한도 필요하지 않다.
read함수
ssize_t read(int fd, void *buf, size_t count);
struct person p; 를 선언 해주고 써주자.
여기서, read 함수는 file에 끝을 만났을때는 0을 리턴해주기 때문에 예외처리를 하나 더 해준다.
printf 함수로 읽어와준다.
do while을 이용해서 ret 이 sizeof(struct person)과 같을동안 돌려줄텐데, 결국 무한루프 형태고, 파일에 끝에 갔을땐 어차피 종료 될테니 while(1) 로 해주자.
마무리
6. 완성된 전체 코드이다.
7. gcc 명령어를 이용해 컴파일 해준 뒤, ./read 명령어를 입력해 결과 값을 확인 해보자.
정상 출력된다.!