파일 개방 및 입출력

2023. 2. 14. 22:28C언어/기본 개념

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