본문 바로가기
카테고리 없음

[c언어] 파일 입출력 fscanf() 와 fgets()

by Ryan Kim 2015. 4. 12.

 

[c언어] 파일 입출력 fscanf() 와 fgets()

 

 

파일입출력을 할때 fscanf와() fgets()는 각각 장단점이 있다.

 

fscanf 와 같은 경우는 정수형, 문자형, 문자열형을 형별로 입력이 가능하며,

개발자가 임의로 각각의 값을 구별하기 위해 구분자를 제공할 수 있다.

하지만 단점은 만약에 입력되어 있는 값이 한덩어리의 문자열이지만,

그 문자열이 공백을 포함하고 있는 경우에는 개발자가 임의로 구분자를 제공했더라도

추가적으로 공백도 구분자로 컴파일러가 받아들인다. 그래서 입력되어 있는 값이

예를 들어 "슈퍼맨이 돌아왔다" 인경우 fscanf()는 "슈퍼맨"이 "돌아왔다"를 따로 구분해버린다. 

이러한 단점은 fgets()를 통해서 해결할 수 있다. fgets()와 같은 경우는 하나의 문자열은 그냥 그대로

하나의 문자열로 인식하다. 하지만 각각의 문자열은 개행으로 구별해 줘야 한다.

왜냐하면, fgets()는 공백으로 문자들을 구별하는게 아니라 개행으로 구별을 하기 때문이다.

그러므로 애초에 파일로 데이터를 출력할때 정수형은 정수형대로 구별하고 문자열은 문자열대로 구분해서

각각의 데이터를 fscanf()와 fgets()를 통해서 각각 입력 받으면 된다.

 

ex)당신이 슈퍼마켓 재고를 관리하는 프로그램을 만드는데 데이터베이스를 사용하는 것이 아니라 파일을 사용하는 경우

 

1 20

매운 새우깡

농심

2 30

치토스 매콤한 맛

 

위에 첫번째 정수는 식별자이며, 두번째 정수는 재고이다.

그다음 매운 새우깡은 재고 이름이다.

그러므로 정수와 같은 경우는 fscanf()를 사용해서 공백을 구분자로해서

각각의 정수를 변수에 입력하고,

다음 매운 새우깡 같은 경우는 하나의 문자열이므로 만약 fscanf()를 사용하는 경우는

"매운" 따로 "새우깡" 구별하므로 자기가 원하는 데이터값을 얻을 수 없으므로

fgets()를 사용해서 "매운 새우깡"을 파일 입력 받는다.

이때 주의할 점은, 위에서 말했듯이 fgets()와 같은 경우는 개행문자도 뒤에 포함되므로

개행문자를 제거주기 위한 과정이 진행되어야 한다.

 

 fgets(str, strlen(str), stdin);
 str[strlen(str) - 1] = '\0';