Read and Write a Stream
Character-At-A-Time I/O - 문자 기반 입출력
int fgetc(FILE *fp); // 문자 기반 입력 함수
파일 포인터가 가리키는 파일로부터 문자 한 개를 읽어옴
int getc(FILE *fp);
매크로로 구현되어 있어 실행 속도는 약간 빠르지만
실행 코드가 확장되므로 메모리를 조금 더 차지함
성공하면 다음 char 리턴 에러는 EOF(-1)
리턴형을 char가 아닌 int로 정의한 이유는 char형으로 할 경우 값의 범위에 제한이 있기 때문
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
인자로 받은 int형 데이터 c를 char로 변환해 파일에 씀
성공하면 해당 문잣값 리턴, 에러는 EOF(-1)
Exercise
if((rfp = fopen(argv[0], "r")) == NULL) {
perror(argv[0]);
}
if((wfp = fopen(argv[1], "w")) == NULL) {
perror(argv[1]);
}
while((c = fgetc(rfp)) != EOF) { // 한 문자씩 읽음
fputc(c, wfp); // 기록
}
Line-At-A-Time I/O - 문자열 기반 입출력
char *gets(char *s)
char *fgets(char *s, int size, FILE *stream)
s - 문자열을 저장한 버퍼의 시작 주소
size - 버퍼의 크기
stream - 파일 포인터
fgets(str, 100, rfp) // 문자열을 최대 100자리까지 읽어서 str에 담음
gets
표준 입력에서 문자열을 읽어들임
문자열은 엔터키를 입력하거나 파일의 끝을 만날 때까지 읽음
읽어들인 문자열의 끝에서 개행 문자(엔터키 값)를 제외하고 널 문자('\0')를 채워
인자 s가 가리키는 영역에 저장하고 리턴
s가 확보하고 있는 메모리의 크기를 알 수 없기 때문에 s가 가득 찬 후에도 계속 읽을 수 있음
이 때문에 보안 침해 문제가 발생가능하여 가능하면 gets()함수는 사용하지 않는 것이 좋음
fgets
파일 포인터가 가리키는 파일에서 size에 지정한 길이보다 하나 적게 문자열을 읽어 s에 저장
도중에 개행 문자나 파일의 끝을 만나면 해당 지점까지만 읽음
gets와 달리 개행 문자나 버퍼의 마지막 문자 다음에 널 문자도 저장함
수행하면 s의 시작 주소를 리턴, 파일의 끝이거나 오류인 경우 NULL을 반환
int puts(char *s)
s가 가리키는 문자열을 표준 출력으로 출력
개행 문자를 추가해 출력
int fputs(char *s, FILE *stream)
s가 가리키는 문자열을 파일 포인터가 가리키는 파일로 출력
출력할 때 개행 문자를 추가하지 않음
성공하면 음수가 아닌 수를 리턴, 파일의 끝이면 EOF(-1)
Exercise
FILE *rfp, *wfp;
char buf[1024];
if((rfp = fopen(argv[0], "r")) == NULL) {
perror(argv[0]);
}
if((wfp = fopen(argv[1], "w")) == NULL) {
perror(argv[1]);
}
while(fgets(buf, 1024, rfp) != NULL) { // NULL이 될 때까지 한 행씩 buf로 읽음
fputs(buf, wfp);
}
'Linux' 카테고리의 다른 글
[Linux] 하드링크, 심볼릭링크 (0) | 2022.08.05 |
---|---|
[Linux] 디렉토리와 파일 정보 조작하기 (0) | 2022.08.05 |
[Linux] file IO(고수준 파일) - fopen, fread, fwrite (0) | 2022.07.27 |
[Linux] 파일 오프셋 - lseek (0) | 2022.07.27 |
[Linux] file IO(저수준 파일) - open, read, write (0) | 2022.07.27 |