2010년/3월

3월23일 indirection 파일입출력

뽀얀햄스터 2010. 3. 23. 12:27


-파일입출력-
기본적으로 우리가 사용하는 프로그램같은경우는 모든 연산은 주기억장치에서 이루어지게 된다. 그리고  실행되기전까지 주기억장치에 이루어지지만 단지  컴퓨터의 전원이 꺼질경우 보관하기위해서 보조기억장치에 저장이 된다. 그래서 우리가 보는 파일들은  보조기억장치에 있고 그것이 메모리에 올라가고 다시 CPU에 거쳐서 올라가서 실행까지  가능하다.
 
#include<stdio.h>
int
 main()
{  
  int score;
  char name[10];
  FILE *fpin, *fpout; 

  fpin = fopen("do327.in","r");   
 
                                   
  fpout  = fopen("do327.out","w"); 
  while(!feof (fpin))  //나쁜예   
  {
    fscanf(fpin,"%s %d",name,&score);
    printf("%s\t%d\n",name,score);
    fprintf(fpout,"%s\t%d\n",&name,&score);
  }
  fclose(fpin);
  fclose(fpout);
  return 0;
}

fopen
fclose

파일을 입출력하기 위해서는 꼭  필요하다.  당연히open했으니깐 close해주는것이고 fopen한값의 주소는   저장하기  위해서 FILE * 필요하다. 
feof(end of file) (fpin) fpin을 받아서 끝인지  확인한다. f가  붙은것은 파일포인터를 필요로한다.

-indirection-
무엇보다 printf와 scanf는  우리보기에 너무 좋게 사용하고 있다  하지만 원래 그함수의 용도는 fprintffscaf로 파일포인터였다. 그래서 실행하기 위해서 stdout(표준출력),stdin(표준입력),stderr(표준입출력오류및로그)  이다
fprintf(stdout," %d",inum);  이런형식으로 출력하게 된다. 단지 printf가 stdout을 생략하고  출력만 되게 한것이다. fprintf는 파일포인터로  받아온다 하지만 stderr와 stdout의 차이점이  중요한데 화면 출력은  둘다 된다 하지만  indirection을 통해서 dos창에서 차이점을 알수 있다. 
실행파일  >test.txt   저 > 표시가 오른쪽로 넘겨준다. 그리고 로그만 따로 다른곳에 저장해서  알수 있고 관리할수 있다. 이는 포인터함수를 사용해서 이프로그램이나 문서의 자료의 대한 정보나 로그등 따로 저장해서 관리 할수 있음을  알수있다.  여기서  실행파일 0>test.txt  실행파일 2>test.txt 0와 2의 옵션이 있다. 0은 다보여주고 아무것도 넣지 않는다. 하지만 2옵션을 채택할경우 test.txt 에 stderr로 지정한 값들을 저장할수 있다.



-함수-
함수는 여러 장점들이 있다. 프로그램의 난이도를 낮출수있고 여러사람이 나누어할수도 있고  반복적으로 끌어서 사용도 가능하며 오류가  검출되지 않으면  다시 오류검사를  할 필요가없다.
#include<stdio.h>
float
 average(int ione,  int itwo);
int main()
{
  int inum;
  int isunum;

  float  favg;

  printf("please enter an integer: ");
  scanf("%d",&inum);
  printf("please  enter an  integer: ");
  scanf("%d",&isunum);

  favg =average(inum,isunum);
  printf("The average  of %d and %d is  %6.3f\n",inum,isunum,favg);
  
  return 0;
}

float average(int ione, int  itwo)
{
  float favgr;

  favgr=(float)(ione+itwo)/2;

  return favgr;



}


float average(int ione, int  itwo)
여기서  float는 반환(자료)형이다.
average는 함수 이름이며
(int ione,int itwo)이는 인자또는 인수라고 한다.
이모든것을 합쳐서 함수의 원형 또는 프로토타입 인터페이스라고 한다.

main()함수를 선언하고 inum에 5를 집어 넣고 isunum에 6을  넣었다  그리고 favg는 아직 값이 없어서 쓰레기값이 들어가 있다.


이제 favg=average(inum,isunum)을 통해서 average함수로 넘어가게 된다 여기서  인수갑은 ione과  itwo가 각각 5와  6이라는 값을 받게  된다. 함수가 시작될때 인수는 거꾸로 받아서 메모리에 저장되기때문에 ione주소값이 itwo주소값보다 크다. 그리고 return address와 old ebp는 다음시간에 배우기로 했다. 그리고 평균값으로 나오는  favgr의 갑은 5.5의 값이 들어간다 하지만 5.5가 들어가기전에 int형 저장구조와 float의 저장구조가 틀리다..

무엇보다 함수의 사용에서 원형과 인수 그리고 반환자료형 그리고 리턴값 알아야한다.