본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]이동현_12월1일일보고서

by 알 수 없는 사용자 2011. 12. 1.
728x90
반응형
◎C++

○파일 입출력

#include<iostream>
#include<iomanip>


int main()
{
  cout.width(10);
  cout<< 333<<","<<334<<endl;
  cout.setf(ios::fixed);
  cout.precision(2);
  cout<<3.33333<<endl;

  cout.fill('*');
  cout.width(10);
  cout<<333<<endl;
  cout<<hex<<333<<endl;
  cout<<setw(10)<<333<<endl;
  cout<<setiosflags(ios::scientific)<<12.34<<endl;
  cout<<resetiosflags(ios::scientific)<<12.34<<endl;

  return 0;
}
☆결과



cout.width(10);은 출력될 공간을 지정하는 것이다. 10자리를 확보하고 333을 적으면 7자리는 비워놓고 333을 뒤에 출력한다.

cout.setf(ios::fixed);
cout.precision(2);
은 소수점 2자리만 출력한다. setf가 명령없이 precision(2)만 적게 되면 전체의 숫자크기를 2로 지정한다고 해서 3.3이 출력된다.

cout<<hex<<333<<endl;
cout<<setw(10)<<333<<endl;
은 hex는 333을 헥사값 16진수로 표현하여서 14d로 출력되고 setw(10)은 width()명령과 같다.
setiosflags는 소수점 자리를 잘라 버린다.


○파일 입출력
 #include<iostream.h>
#include<fstream.h>


int main()
{
  ofstream file("test.txt");
  if(true == file.is_open())
  {
    cout<<"open succese"<<endl;
  }
  if(false == file.is_open())
  {
    cout<<"open false"<<endl;
  }

  return 0;
}

☆결과


파일 오픈이 성공했음을 출력하고, test.txt.파일 생성된것을 확인할수 있다.

파일을 root에 보내기를 하여서 chmod 000 test.txt를 하게되면


test.txt 파일앞에 모드가 ------되어있는것을 볼수 있다. 이것을 읽기와 쓰기모드를 못하게 하였다. 하지만 실행을 하게되면 파일이 오픈된다. 이유는 root폴더여서 무시하고 모든 파일을 열어주기 때문이다.


하지만 su - uec를 하여서 root계정이 아닌 계정으로 하게 되면 실행파일이 실행했을 때 파일열기가 실패 하는 것을 확인 할 수 있다.

☆템플릿 클래스의 사용
 #include<iostream.h>

template
<typename T>
class AutoArray
{
  public:
    AutoArray(T *ptr)
    {
      _ptr = ptr;
      cout<<"생성자\n";
    }
    ~AutoArray()
    {
      delete[] _ptr;
      cout<<"소멸자\n";
      
    }
    T& operator[] (int index)
    {
      return _ptr[index];
    }
  private:
    T * _ptr;
};

int main()
{
  AutoArray<float> arr(new float[100]);
  arr[0= 99.99f;
  cout<<arr[0]<<endl;
  return 0;
}

☆결과



T& operator[] (int index)
{
   return _ptr[index];
}
이 연산자는 배열 연산자이다. 그리고 메인함수에서 arr을 new로 동적 할당을 하였는데 메인함수에서 delete를 하지않는것은 AutoArray소멸자에서 delete를 해주기때문에 따로 사용하지 않았다.

탬플릿 클래스의 객체를 생성하는 순간에 컴파일러 내부적으로 알맞은 클래스를 만든다.






※템플릿 사용시 유의 할점

1.템플릿은 컴파일 시간에 코드를 만들어낸다.
 -그렇기 때문에 템플릿의 사용으로 인한 속도 저하는 생기지 않는다.
 -하지만, 컴파일 시간이 오래 걸리는 단점이 있다. (하지만 크게 문제가 될 정도는 아님)
2.템플릿 함수의 정의는 헤더 파일에 놓여야 한다.
 -컴파일 시간에 클래스나 함수를 만들어내기 위해서는 헤더 파일에위치할 필요가 있다.(컴파일 시간에는 다른 구현 파일의 내용을 확인할 수 없다.)

○STL 컨테이너
☆list클래스의 사용

 #include <list>
#include <iostream>

int main()
{
  //int 타입을 담을 링크드 리스트 생성
  std::list<int>intList;

  //1~10까지 링크드 리스트에 넣는다.
  for(int i = 0; i<10; ++i)
    intList.push_back(i);

  //5를 찾아서 제거한다.
  intList.remove(5);

  //링크드 리스트의 내용을 출력한다.

  std::list<int>::iterator it;
  for(it = intList.begin(); it != intList.end(); ++it)
  std::cout<<*it<<endl;

  return 0;
}


☆결과



intList.remove(5);에서 remove는 검색과 삭제를 같이 한다. 5를 찾아서 5를 제거하기 때문이다. 만약에 제거하기전에 리스트를 출력하면 어떻게 될것인가?
 #include <list>
#include <iostream>

int main()
{
  //int 타입을 담을 링크드 리스트 생성
  std::list<int>intList;

  //1~10까지 링크드 리스트에 넣는다.
  for(int i = 0; i<10; ++i)
    intList.push_back(i);

  std::list<int>::iterator it;
  for(it = intList.begin(); it != intList.end(); ++it)
    std::cout<<*it<<endl;

  //5를 찾아서 제거한다.
  intList.remove(5);

  //링크드 리스트의 내용을 출력한다.
  return 0;
}
☆결과

5가 출력되는 것을 확인 할수 있다.




○예외처리
예외란 우리가 당연하다고 가정한 상황이 거짓이 되는 경우를 말한다.
♧대표적인 예
 1.컴퓨터에 사용 가능한 메모리가 부족한 경우
 2.당연히 있을 것이라 생각할 파일이 없는 경우
 3.사용자가 잘못된 값을 입력하는 경우

예외처리란 이러한 상황이 발생한 경우에도 프로그램이 올바르게 동작할 수 있도록 처리하는 것을 말한다.
 예)컴퓨터에 사용 가능한 메모리가 부족해서 동적 메모리 할당이 실패한 경우에 예외 처리를 잘 하지 못한 프로그램은 비정상 종료 할 수 있다.반면에 예외 처리를 잘 한 프로그램은 사용자가 작업중이던 정보를 잘 보관한 후에 정상적으로 종료할 수 있다.


SetAt()함수나 GetAt()함수에 너무 큰 인덱스를 넘겨주면 할당되지 않은 메모리를 건드려서 프로그램이 비정상 종료 할 수 있다.



☆C++의 구조적 예외 처리를 사용해서 실패를 알리는 예

try에서 동작을 하다가 만약 arr.SetAt(10,100);에서 예외처리가 발생하게 되면 if문이 수행되어 throw(던지다)에서 ""를 던져저서 catch가 잡는데 ""는 const char *이기 때문에 catch가 const char *로 받아서 cout으로 출력하게 된다.

☆예외의 발생 흐름


드디어 2011년도 마지막 달이 왔네요!! 모두들 한해 마무리 잘하시고, 모두들 좋은 곳에 취직하시길 바랍니다!!
^^;
728x90