BOX-IT/C++

[C++] (2) 파일 입출력

Buang 2022. 5. 16. 16:49
반응형

<목차>

 

1. 파일 개방

- 표준 입출력 스트림 파일

- fopen

- fgetc함수(하나의 문자를 가지고 오는 함수)

  - 위치 지시자

  - EOF (-1)

- fputs 함수(하나의 문자를 출력하는 함수)

 

2. 텍스트 파일과 바이너리 파일

3. +개방 모드, fseek, rewind, feof 함수


fopen함수를 통해서 파일을 개방하고 난 다음

실제로 입출력을 할 때는 입출력 함수를 사용한다.

 

입출력 함수엔 다양한 함수가 있다. 

가장 기본적으로 사용할 수 있는 건 하나의 문자열을

입력하거나 출력하는 함수가 되는 것이다. 

 

실제로 데이터를 파일로부터 입력을 시켜서

출력하는 프로그램을 만들려고 한다.

 

FILE* fp;                    // 파일 포인터 선언
fp = fopen("a.txt", "r"); // fopen함수를 통해서 a.txt란 파일을 read 모드로 해서 개방해라(찾아라)

if(fp == NULL)           // 개방이 잘 됐는지 체크하는 것, Null이면 파일이 없는 것
{
    printf("file not found"); //파일이 없으면 없다고 알려주고
    exit(1);                      // 실행종료하기
}

 

fgetc함수와 fputc 함수

 

하나의 문자를 입력할 때 사용하는 함수가 fgetc다.

fgetc는 어떠한 파일로부터 문자를 가지고 올 것인지

파일 포인터를 줘야 할 것이다. 

 

fgetc(fp) // fp를 인수로 주면 fgetc는 파일 포인터를 가지고

a.txt파일의 실제 데이터로 간다. 거기서 실제 데이터를 가져다가

반환을 해준다. 

 

반환한 값을 문자에 받아주기 위해서

 

ch = fgetc(fp)로 만들어주고

ch를 받아주기 위한 char ch; 즉 character형 변수 ch를 선언해주면 된다.

코드를 짜면 아래와 같다. 

 

char ch;

FILE* fp;                    // 파일 포인터 선언
fp = fopen("a.txt", "r"); // fopen함수를 통해서 a.txt란 파일을 read 모드로 해서 개방해라(찾아라)

if(fp == NULL)           // 개방이 잘 됐는지 체크하는 것, Null이면 파일이 없는 것
{
    printf("file not found"); //파일이 없으면 없다고 알려주고
    exit(1);                      // 실행종료하기
}

ch = fgetc(fp);
printf("%c", ch); //fp에 있는 a.txt로 가서 문자 한 개를 가져와서 ch저장하고
                  // printf를 통해 문자 한 개를 출력하고 끝나는 함수다.
                  
fclose(fp);       // file에 있는 데이터 다 썼으면 fclose로 닫아주면 된다.
return 0;
}

 

1) 위치 지시자

 

ch = fgetc(fp); 

printf("%c", ch);

 

를 두 번 쓴 경우 a가 출력되는 게 아닌 p가 출력된다.

FILE 구조체에는 위치 지시자라고 해서

배열 인덱스가 있다. fgetc가 문자를 읽을 때 마다

0에서 1로 1에서 2로 이렇게 증가해서 a 다음에 p를 출력할 수 있는 것이다.

 

2) EOF <<(-1과 같다)

 

ch = fgetc(fp);

printf("%c", ch);

 

를 6번 째 썼다면 apple는 다섯 글자이고

여섯 번째에는 아무것도 없어서

쓰레기 값을 출력할 수 있는데

FILE 구조체에는 apple이의 크기 정보도 있기 때문에

자동적으로 여섯 번째 부터는 파일의 데이터를 다 읽었다고 인지하고

더 이상 출력할 수 있는 데이터가 없다는 표시로

EOF(End Of File)가 출력된다. 

 

자 그러면 한 문자만 출력되는 게 아닌

파일에 있는 모든 문자를 출력하고 싶다면

fgetc가 반환하는 값이 EOF가 아닐 때 까지 출력하라.

라고 만들어주면 된다.

 

코드를 만들면 아래와 같다.

 

ch = fgetc(fp);
while(ch != -1); //eof가 아니라면
{
    printf("%c", ch); //문자를 찍어라
    ch = fgetc(fp);   // 다음 문자를 읽어주고, 다시 while문 위로 올라간다.
}

 

파일로 데이터 출력 방법

 

a.txt안에 있는 파일을 읽어서 

화면에 출력하는 게 아니라 

디스크 파일에 다시 기록하는 것,

이건 복사 프로그램이 된다. 

 

즉 하드디스크 안에 있는 a.txt란 파일을 읽어서

다시 하드디스크로 출력하는 거다. 

 

파일로 데이터를 출력하려면 파일 한 개를 더 개방해줘야 한다. 

 

char ch;

FILE* fp; *ofp;           // 파일 한 개를 더 개방하는 거니까 ofp 추가 선언. 출력용으로 선언함
fp = fopen("a.txt", "r"); // fopen함수를 통해서 a.txt란 파일을 read 모드로 해서 개방해라(찾아라)

if(fp == NULL)           // 개방이 잘 됐는지 체크하는 것, Null이면 파일이 없는 것
{
    printf("file not found"); //파일이 없으면 없다고 알려주고
    exit(1);                      // 실행종료하기
}

ofp = fopen("b.txt", "w"); //a.txt에서 읽어와서 read모드로 오픈했잖아?
                           // b.txt로 다시 write 모드로 오픈할 거다. 

                           // b.txt가 현재 디렉터리에 없으면 null을 반환하는 게 아니라
                           // 빈 파일을 한 개 생성 시켜서 open을 해준다.

ch = fgetc(fp);
while(ch != -1)
{
    fputc(ch, ofp);        //출력할 문자 ch를 준다. ofp 파일과 연결되어 있는 게 b.txt다. 
                           // 거기에 hdd 생성되어 있을 것이고 
    ch = fgetc(fp);        // fp는 a.txt로부터 입력받은 문자를 출력하라 
}                          // a.txt에 있는 파일의 내용을 b.txt로 복사하는 것이다. 

fclose(ofp);

 

 

2. 텍스트 모드와 바이너리 모드

 

fp = fopen("a.txt", "r"); 를 보면

 

r만 써져 있는데 r만 쓰면 안된다.

이건 용도에 대한 모드고

파일의 형태를 나타내는 모드도 같이 써줘야 한다.

a.txt는 txt 파일 형태이기 때문에

 

fp = fopen("a.txt", "rt");

 

이렇게 작성해줘야 한다.

 

 

 

 

반응형