파일 개방 및 입출력
2023. 2. 14. 22:28ㆍC언어/기본 개념
728x90
파일개방과 폐쇄
파일을 개방하는 함수는 fopen이다.
fopen(파일명,개방모드)
개방모드
- "r" 읽기모드
- "w" 쓰기모드 (만약 파일명이 있다면 내용을 다 지우고 새로 쓰기 때문에 주의해야한다. 파일명이 없다면 새로 만든다.)
- "a" 덧붙이기
ex. fopen("a.txt","r") // a.txt파일을 읽기 모드로 개방하겠다.
파일에 위치를 알아야 접근 할 수 있기 때문에 FILE구조체의 주소 값을 받을 포인터 변수를 선언 해줘야한다.
FILE *fp;
fp = fopen("a.txt","r");
파일이 없는 경우는 NULL값을 반환한다.
개방한 파일들이 필요가 없어질 경우 fclose함수로 닫아줘야한다.
fclose(fp);
이때 fopen 함수는 현재 디렉토리 작업에서만 찾는다.(컴퓨터 전체에서 찾지 않음)
만약 특정하고싶을 경우 "sub\\a.txt" 형식으로 작성해야한다. '\'를 인식하게 하기 위해서 두 번 작성해준다.
fgetc : 어떤 파일로부터 문자를 가져올 것인가? 그 파일로 가서 하나의 문자를 반환해준다. 문자를 받아줄 변수를 지정해줘야한다.
fputc : 파일로 하나의 문자를 출력한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
int main(void)
{
FILE* fp;
char ch;
fp = fopen("a.txt","r");
if (fp==NULL)
{
printf("파일이 없음");
exit(1);
}
ch = fgetc(fp);
printf("%c", ch);
fclose(fp);
return 0;
}
|
cs |
파일로 데이터 출력방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
int main(void)
{
FILE* fp, *ofp;
char ch;
fp = fopen("a.txt","r"); // 원래는 rt, wt로 작성해야 한다. txt모드라는 뜻이다.
ofp = fopen("b.txt", "w"); // 다른 바이너리 모드(rb, wb)가 있다. 기본적으로는 txt파일로 인식한다.
if (fp==NULL)
{
printf("파일이 없음");
exit(1);
}
ch = fgetc(fp);
while (ch != -1)
{
fputc(ch, ofp);
ch = fgetc(fp);
}
fclose(fp);
fclose(ofp);
return 0;
}
|
cs |
stdin, stdout, stderr은 운영체제가 개방하는 파일
fscanf, fprintf
파일로부터 입력받고, 파일로 출력할 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include <stdio.h>
int main(void)
{
FILE* fp, *ofp;
char name[20];
int kor,eng, mat;
int tot;
double avg;
fp= fopen("a.txt","r");
ofp = fopen("b.txt", "w");
if (fp == NULL)
{
printf("파일이 없음");
exit(1);
}
while (1)
{
fscanf(fp, "%s%d%d%d", &name, &kor, &eng, &mat); //scanf를 사용할건데 파일로부터 입력받을 것이라는 의미이다.
if (feof(fp)) break;
tot = kor + eng + mat;
avg = tot / 3.0;
fprintf(ofp,"%10s%5d%7.1lf\n", name, tot, avg);
}
return 0;
}
|
cs |
fread, fwrite
fwrite(인수로 출력할 데이터의 메모리 주소, 크기, 개수, 파일 포인터)
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
int main(void)
{
FILE* fp;
int a = 10;
fp = fopen("b.txt", "wb");
fwrite(&a, sizeof(a), 1, fp); // '출력한' 바이트 수 반환
fread(&a, sizeof(a), 1, fp); // '읽은' 바이트 수 반환
return 0;
}
|
cs |
개방모드('+' 모드)
r+ : 읽기모드이지만 쓸 수도 있다.
w+ : 쓰기모드이지만 읽을 수도 있다.
rewind(fp) 마지막 위치에서 처음으로 돌아가게 만드는 함수
a+ : 붙여넣기 후 읽을 수 있는 기능
fseek(fp, offset, wherefrom);
wherefrom
- SEEK_SET 첫 바이트부터 오프셋(거리)만큼 옮겨라(오프셋이 양수)
- SEEK_CUR 현재 위치 지시자부터 몇 오프셋만큼 옮겨라
- SEEK_END 끝 바이트부터 앞쪽으로 몇 오프셋만큼 옮겨라(오프셋이 음수)
728x90
'C언어 > 기본 개념' 카테고리의 다른 글
분할 컴파일 (0) | 2023.02.23 |
---|---|
전처리 지시자 (0) | 2023.02.15 |
구조체 활용, 공동체, 열거형 (0) | 2023.02.10 |
구조체 (0) | 2023.02.09 |
동적 할당 저장 공간의 활용 (0) | 2023.02.09 |