Prosto

파일 입출력(FILE*) 이해, 예제 -2 -C언어 본문

Programing/C Programing

파일 입출력(FILE*) 이해, 예제 -2 -C언어

Prosto 2016. 9. 19. 12:43

'파일 입출력 - 파일을 생성하고 쓰고, 읽을 수 있는 방법!'

 

저번 시간에 설명했듯이 프로그래밍을 하다보면 파일을 만들어서 데이터를 보관하는 경우도 있고,

어떤 데이터가 저장된 파일을 읽어와 사용하는 경우도 있습니다.

(C언어에서) 이때 사용하는 것이 바로 파일 입출력입니다.

 

 

이번에는 그 파일 입출력에서 fscanf에 해당하는 파일 입력 부분을

함께 보도록 하겠습니다.

(fopen, fclose, fprintf에 대하여는 저번 시간에 자세히 봤죠?)

 

그리고 fscanf의 예제와 문제까지 끝나면

조금 더 심화된 문제들을 풀어보도록 하겠습니다.

 

 

 

fprintf는 파일에 출력을 주는 거였죠?

마치 우리가 printf로 콘솔창에 출력을 시킨 듯 말이죠.

그렇다면 fscanf는 무엇과 비슷할까요?

(바로 scanf겠죠?)

우리가 printf 후에 scanf를 차례대로 했던 것처럼,

fprintf 후 fscanf를 보고있는 것입니다!

 

 

fscanf는 파일에서 입력을 받아오는 것입니다.

예를 들어 txt 파일 첫 번째 줄에 "안녕하세요."라고

입력되어 있었다면 우리는 그 "안녕하세요."라는 문자열을 얻어올 수 있는 거죠.

뿐만 아니라 숫자도 얻어올 수 있겠죠? 차근차근 확인해봅시다.

 

 

fscanf 어떻게 사용할까요?

fprintf와 scanf를 합친 느낌으로 보면 됩니다.

fscanf(파일포인터, "자료형", &받을 변수);입니다.

예를 들면 fscanf(fp, "%d", &num); 같은 방식이죠.

이렇게 txt나 여타 파일에서 fscanf를 이용하면 읽어 우리의 프로그램에서 사용이 가능한 것입니다.

 

 

간단 예제를 확인해볼까요?

이렇게 정수를 fprintf를 이용하여 파일에 출력해주고,

다시 우리가 그 파일을 열어 fscanf로 변수에 입력하여 그 결과를 확인해봤습니다.

 

fscanf 사용에 있어서 중요한 점을 확인해봐야겠죠?

파일입력을(fscanf) 받고 싶다면 fopen을 할 때 권한(모드)를"rt"로 주어야 제대로 원하는 값을 받을 수 있습니다.

fps = fopen("exex.txt", "rt"); 같이 말이죠.

 

 

그럼다음으로 fscanf(fps, "%d", &tempNum);

여기는 우리가 파일에 있던 정수를 하나 받아왔죠. fprintf와 유사하고 scanf와도 유사하다는 것을 알 수 있죠?

 

첫 번째 인자는 파일포인터입니다. 어떤 파일에 처리해줄지 정해줘야겠죠.(fprintf와 같습니다.)

 

두 번째 인자는 데이터 형식입니다. 우리는 여기서 정수를 받을 것이니 %d를 썼죠?

세 번째 인자는 받을 변수입니다. tempNum을 int로 선언해둔 후 값을 받아왔죠?

 

나머지 fclose는 전과 똑같습니다. 사용했으면 닫아줘야겠죠.

 

 

 

그럼 fscanf를 이용한 예제를 하나 더 보며 익혀볼까요?

이렇게 형식을 주고 fprintf를 이용하여 파일출력을 한 후

fscanf로 그 형식에 알맞게 받아온다면 제대로 된 결과를 받아볼 수 있습니다.

 

 

 

제대로 사용하기 위해 추가로 예제 하나만 더 보도록 할까요?

(feof 사용에 대한 부분입니다.)

 

어떤 프로그램이냐하면

파일에 1부터 100까지 정수를 출력시켜보고 그 파일을 읽어서 콘솔에 표시합니다.

(exex 텍스트 끝이 100인 것을 확인할 수 있습니다.)

 

그럼 그 소스를 봅시다!

(우측에 살짝 출력 결과도 같이 볼 수 있습니다.)

 

자 여기서 fscanf를 이용하여 입력받고 printf로 출력해주는 부분이 있는

while문을 주목해주세요.

while문에 조건으로 (feof(fps)==0)가 있죠?

여기서 쓰인 feof(파일포인터)는 현재 파일포인터가 가리키는 파일의 내용이

있는지 여부를 확인하고 있으면 0, 없으면 1을 반환해줍니다.

while문을 반복하며 fscanf로 입력을 받을 때마다 하나씩 하나씩 이동해가다가

최종적으로 100까지 가면 더 이상 내용이 없으니 1을 반환하여 while문이 종료된 것입니다.

 

 

그럼 이 내용들을 이용한 문제들을 풀어볼까요?

 

문제1.

  (1)파일포인터를 이용하여(fprintf) 파일에 구구단의 2단을 넣으시오.

  (2)파일에 넣은 구구단을 파일포인터로 읽어들여(fscanf) 화면에 다시 출력하시오.

 

(콘솔 출력 + 파일 생성 결과 예)

 

 

 

문제2. 해당 프로젝트 내에 텍스트 파일을 만들어 임의의 텍스트를 저장한 후(몇 줄에 걸친 긴 내용)

 프로그램에서 해당 파일의 내용들을 읽어들여 콘솔창에 출력하시오.

(굳이 fprintf로 입력하지 않아도 됩니다. 입력해도 무관. 파일입력(fscanf, fgets)과 feof 사용이 중요.)

 

(콘솔 출력 + 파일 생성 결과 예)

 

 

 

 

결과는 모두 잘 나왔나요?

 

그럼 이제 제가 작성한 코드와 실행 결과를 올리겠습니다.

비교해보고 참고하세요.

 

 

-1번 문제-

for문을 이용하여 fprintf로 구구단 2단을 등록해줬고,

다시 가지고 올 때도 마찬가지로 for문을 이용하여

fscanf로 가지고와서 printf로 출력해줬습니다.

 

 

 

-2번 문제-

 

fpp를 이용하여 파일에 출력한 부분은 안 했어도 상관 없습니다.

밑에 문자열을 가지고 올 때 어떻게 했는지 보세요.

같은 방법으로 하셨나요?

 

 

 

지금까지 파일 입출력에 대하여 알아봤습니다.

이번 2는 fscanf에 대하여 알아봤고

fprintf / fscanf / feof / fgets까지 더 자세히 다뤄봤습니다.

파일 입출력의 이해에 도움이 좀 됐다면 좋겠습니다.

  ( 파일 입출력1,  파일 입출력 오류가 발생한다 )

 

질문은 댓글이나 메일로 따로 연락주시면 시간되는 때 답변드리겠습니다. ( 연락 )

Comments