13장 스트림과 파일 입출력 라이브러리
13장 스트림과 파일 입출력 라이브러리
1. 스트림과 파일 입출력 이해하기
1) 스트림(stream)
- 입력 장치로부터 입력되는 데이터, 출력장치로 출력되는 데이터의 흐름
- 프로그램과 입출력 장치들과의 논리적인 연결
- 버퍼(buffer)를 이용하여 데이터를 입출력
- 입출력 장치들의 처리시간에 따른 지연을 방지
2) 표준 입출력 스트림은 프로그램 실행 시 자동으로 생성 됨
1) 스트림(stream)
- 입력 장치로부터 입력되는 데이터, 출력장치로 출력되는 데이터의 흐름
- 프로그램과 입출력 장치들과의 논리적인 연결
- 버퍼(buffer)를 이용하여 데이터를 입출력
- 입출력 장치들의 처리시간에 따른 지연을 방지
2) 표준 입출력 스트림은 프로그램 실행 시 자동으로 생성 됨
종류 | 장치 | 사용함수 |
---|---|---|
표준입력 | 키보드 | scanf_s(), gets_s() |
표준출력 | 모니터 | printf(), puts() |
3) 파일 입출력 스트림 사용을 하기 위한 순서
- FILE 구조체 포인터 변수 선언 → fopen_s() 함수로 파일 입출력 스트림 생성 → 파일 입출력
- 함수로 파일에 데이터 입출력 → fclose() 함수로 파일 입출력 스트림 종료
4) 파일 입출력 모드
기호 | 설명 | 파일이 존재하는 경우 | 파일이 존재하지 않는 경우 |
---|---|---|---|
r | 읽기 | 스트림 생성 | 파일 입출력 스트림 생성 못함 |
r+ | 읽기+쓰기 | 스트림 생성 | 파일 입출력 스트림 생성 못함 |
w | 쓰기 | 기존 내용을 덮어쓰기 | 새로 생성 |
w+ | 쓰기+읽기 | 기존 내용을 덮어쓰기 | 새로 생성 |
a | 추가 | 스트림 생성 | 새로 생성 |
a+ | 추가+읽기 | 스트림 생성 | 새로 생성 |
2. 파일 입출력 라이브러리 활용하기
1) 텍스트 파일 입출력
- 문자 입출력
- 읽기 : int fgetc(FILE*fp)
- 쓰기 : int fputc(int a, FILE*fp)
- 문자열 입출력
- 읽기 : char*fgets(char*buf, int sizeof(buf),FILE*fp)
- 쓰기 : int fputs(char*buf, FILE*fp)
- 형식지정 입출력
- 읽기 : int fscanf_s(FILE*fp, "%s", input, sizeof(input))
- 쓰기 : int fprintf(FILE*fp, "%d", input)
2) 바이너리 파일 입출력
- 바이너리 데이터 입출력
- 읽기 : int fread(&input, sizeof(int), 1, FILE*fp)
- 쓰기 : int fwrite(&data, sizeof(int), 1, FILE*fp)
- 임의 접근(Random Access)
- 파일의 특정 위치에서 읽거나 쓸 수 있음
- 바이트 단위로 위치를 지정
- 위치이동 : int fseek(FILE*fp, 위치 이동값, 위치 기준값)
- 위치반환 : int ftell(FILE*fp)
3. 단원 실습
1) 실행화면과 같이 data.txt 파일을 프로그램에서 만드시오.
2) data.txt 파일을 읽어서 out.txt를 작성하는 프로그램을 작성하시오.
#include <stdio.h>
#define MAX 3
FILE* ip; // 입력 파일 포인터
FILE* op; // 출력 파일 포인터
struct MEMBER {
char name[10];
int age;
double jumsu;
} data[MAX];
int main()
{
// data.txt 파일 생성
printf("data.txt 파일을 생성합니다.\n");
if (fopen_s(&op, "data.txt", "wt") == 0) {
fprintf(op, "%5s %5d %5.1lf\n", "박장군", 45, 3.2);
fprintf(op, "%5s %5d %5.1lf\n", "최왕자", 32, 4.1);
fprintf(op, "%5s %5d %5.1lf\n", "김공주", 21, 3.5);
fclose(op);
}
else {
printf("data.txt 생성하지 못했습니다.\n");
}
// data.txt 파일 읽어서 구조체 배열에 저장
printf("data.txt 파일을 구조체에 읽어옵니다.\n");
if( fopen_s(&ip, "data.txt", "rt") == 0 ) {
for (int i = 0; i < MAX; i++) {
if (fscanf_s(ip, "%s %d %lf", data[i].name, sizeof(data[i].name), &data[i].age, &data[i].jumsu) != 0) {
printf("%5s %5d %5.1lf\n", data[i].name, data[i].age, data[i].jumsu);
}
}
fclose(ip);
}
else {
printf("data.txt 파일을 열지 못했습니다.\n");
}
// out.txt 파일을 생성합니다.
printf("out.txt 파일을 생성합니다.\n");
if (fopen_s(&op, "out.txt", "wt") == 0) {
fprintf(op, "============================\n");
fprintf(op, "성명\t나이\t학점\t환산(100점)\n");
fprintf(op, "============================\n");
for (int i = 0; i < MAX; i++) {
int val = data[i].jumsu * 20;
fprintf(op, "%-7s\t%-7d\t%-7.1lf\t%-7d\n", data[i].name, data[i].age, data[i].jumsu, val);
}
fprintf(op, "============================\n");
fclose(op);
}
else {
printf("out.txt 생성하지 못했습니다.\n");
}
}
<Result>
Author And Source
이 문제에 관하여(13장 스트림과 파일 입출력 라이브러리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ljsk99499/clang013저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)