본문 바로가기

무언가 만들기 위한 지식/C,C++,Embedded C

[ALL] 표준 파일 입출력과 sprintf

아는 지인이 파일로부터 자료를 읽어들이고, 연산하여 결과를 출력하는 C,CPP 프로그래밍 예제를 만들어달라고 부탁하여 한 20분정도 함수뒤적거리면서 옛기억을 되돌리며 작성해보았다.

조건은 다음과 같다.

1. input.dat 파일에는 Enter를 기준으로 double형 자료가 존재한다.
2. 위 input.dat로부터 파일을 입력받아 자료의 개수만큼의 동적배열을 생성한다.
3. 배열에 정보를 저장한후, 최대/최소/평균을 구한다.
4. 구한 최대/최소/평균값을 output.dat 파일에 기록한후 파일을 종료한다.

사용되는 함수로는 fopen/fseek/fgets/fputs/sprintf/fclose 이다.
모두 기본적으로 stdio.h에 정의된 함수들로 사용법만 알면 간단하다.

원래는 그냥 SystemCall 함수를 이용해서 작성해볼려고 했는데, 은근 줄단위로 읽는게 노가다고 귀찮아서 -.,-;
걍 FILE *를 이용하여 작성하였다. (fgets/fputs가 너무 편하다!)

전체적으로 볼때 fgets를 통해서 자료를 읽어 들여서 총 개수를 파악한후,
fseek를 이용해 FilePointer가 처음을 가리키도록 수정하고,
다시 자료를 처음부터 읽기 때문에 비효율적이다.

차라리 링크드리스트나 정의된 클래스를 가져다가 딱 한번만 읽으면 좋지만,
문제 조건이 다른 라이브러리 클래스를 사용하지 못하게 함이다. (그래서 두번 읽었음 ㅠ.ㅜ)

[작성환경 : Window XP   작성툴 : Visual Studio 6.0   컴파일러 : Visual Studio 6.0    사용언어 : CPP]


fopen/fseek/fgets등은 사용법만 알면 매우 간단하다.
fopen시 FILE*만 잘 다룰줄 알면 된다.

여기서 재미있었던 내용은 바로 sprintf이다.

예전에 술을 마시며 같은과 졸업한 선배와 이야기도중 이런 이야기가 나왔었다.
WIPI Coding을 하는데,
atoi를 라이브러리에 있는에 itoa가 없어서 짜증을 내고 있었지.

필자도 이 간단하거 말들면서 같은 불평이 있었다.
atoi도 있고 itoa는 있고, atof는 있는데 왜! ftoa는 없는거야!!!!!!(노가다를 해야하는건가..)

하지만 다른 방법을 찾아보면 아주 쉬운 길이 있었다.
물론 그 길을 내가 생각해봤던건 아니고 그때 술자리에서 선배가 말해준 내용이 기억나서이다.

그 간단한 방법은 sprintf를 이용하는 것이다.

sprintf는 printf와 비슷한데 모니터에 출력하는 것이아니라 문자열(배열)에 출력해주는 함수이다.
사용법은
sprintf(const char * 문자배열, 저장할 포맷양식, 값) 이다.
포맷만 printf에서 처럼 잘 장의해주면 해당 배열에 맞춰 들어간다.
즉,
sprintf(buffer,"Average Value : %f\n",average);
식으로 작성하면 buffer라는 문자배열에 형식에 맞춘 값이 차곡차곡 들어가게 된다. 물론 %f는 다른 값으로 자유롭게 변경가능하다. 어떻게 보면 string을 다룰때 많이 쓰여야할 것 들인데, 필자는 안쓰고 있었다 -.,-;

결론은 sprintf를 이용하면 itoa나 ftoa등을 억지로 사용할 필요없이 자연스럽게 string으로 전환하여 사용가능해진다는 것이다^^



<왼쪽은 입력파일, 오른쪽은 출력파일>