GSI

파일 끝을 검사하기

C# 2007. 10. 19. 15:44 |

파일 끝을 검사하기
파일의 끝을 지났는지 확인하는 방법에는 두 가지가 있다. 즉, null 예외를 찾는 것과 데이터 스트림의 끝을 찾는 것이다. 실제로, 텍스트 파일의 끝을 지나서 파일을 읽더라도 아무런 에러도 발생하지 않고, 파일 끝 예외도 발생하지 않는다. 그러나 파일의 끝을 지나서 읽으려고 한다면, null 값을 반환받게 될 것이다. 그러므로 이것을 이용하여 파일을 읽는 클래스에서 파일 끝을 검사하는 기능을 만들 수 있다.

private StreamReader rf;
private bool eof;
//--------------
public String readLine() {
   String s = rf.ReadLine();
   if( s == null )
      eof = true;
}
//---------------
public bool fEof {
  return eof;
}

파일의 끝을 지나서 읽는 것을 막기 위한 또 다른 방법은 Stream 객체의 Peek 메서드를 사용하여 미리 값을 꺼내 오는 것이다. 이것은 남은 문자가 있으면 다음 문자의 아스키 코드 값을 반환하고, 남아 있는 문자가 없으면 -1을 반환한다.

public String read_Line() {
   String s = "";
   if(rf.Peek() > 0) {
      s = rf.ReadLine();
   } else {
      eof = true;
   }
   return s;
}
Posted by gsi
:

파일 내에서의 예외 처리

C# 2007. 10. 19. 15:44 |

파일 내에서의 예외 처리
자주 발생하는 많은 예외는 파일의 입출력이 일어날 때 생긴다. 주로 유효하지 않은 파일 이름, 존재하지 않는 파일, 존재하지 않는 디렉토리, 유효하지 않은 파일 이름 인수, 파일 접근 권한 에러 등의 예외를 접할 수 있다. 따라서 파일의 입출력을 처리하는 가장 좋은 방법은, 파일을 처리 하는 코드를 try  불록에 넣고 가능한 모든 에러 조건을 잡아서 당황스럽고 치명적인 에러를 방지하는 것이다. 다양한 파일 클래스의 메서드에서 발생할 수 있는 모든 예외는 문서에 나타나 있다. 그리고 확실하게 모든 예외를 잡아내고 싶으면 일반적인 Exception 객체에 대한 처리를 하면 된다. 그러나 각각의 예외에 대해 다른 처리를 하고 싶다면, 예외에 따라 분리해서 검사할 수 있다.

try {
   // 텍스트 파일을 읽기 위해 연다.
   StreamReader ts = File.OpenText("fool.txt");
   String s = ts.ReadLine();
}
catch (Exception e) {
   Console.WriteList(e.Message);
}
Posted by gsi
:

파일 처리 (File Handling)

C# 2007. 10. 19. 15:42 |

C# 에서 파일을 처리하는 객체는 파일을 유연하게 사용하는 방법을 제공한다.

File 객체
File 객체는 파일을 나타내며, 파일의 존재를 검사하고, 이름을 바꾸고, 지우는 등의 기능을 하는 유용한 메서드 들을 제공한다. 모든 메서드는 static이므로 이들 메서드를 사용하기 위해 File 클래스의 인스턴스를 생성할 필요는 없다. 그 대신, 메서드를 직접 사용하면 된다.

fi(File.Exists("Foo.txt"))
   File.Delete("Foo.txt");

File을 사용하여 파일을 읽고 쓰는데 필요한 FileStream을 구할 수도 있다.

//텍스트 파일을 읽기 위해 파일을 연다.
StreamReader ts = File.OpenText("fool.txt");
//임의의 타입의 파일을 읽기 위해  파일을 연다.
FileStream fs = File.OpenRead("foo2.any");

File  클래스의 메서드들...

  • File.FileExists(filename) : 파일이 존재한다면 true를 반환함
  • File.Delete(filename) : 파일 삭제
  • File.AppendText(fliename) : 텍스트를 덧붙임
  • File.Copy(filename) : 파일 복사
  • File.Move(filename) : 파일 이동 후 이전 파일은 삭제
  • File.GetExtension(filename) : 파일 확장자를 반환함
  • File.HasExtension(filename) : 파일이 확장자를 갖고 있다면 true를 반환함

텍스트 파일 읽기
텍스트 파일 읽기 위해서는, File 객체를 이용하여 StreamReader 객체를 얻어내야 한다. 그 다음에는 텍스트 스트림을 읽는 메서드를 사용하면 된다.

StreamReader ts = File.OpenText("fool.txt");
String s = ts.ReadLine();

텍스트 파일 쓰기
텍스트 파일을 만들고 쓰기 위해서는, CreateText 메서드를 사용하여 StreamWriter를 얻어낸다.

//쓰기 위해 열기
StreamWriter sw = File.CreateText("Foo3.txt");
sw.WriteLine("Hello file");

만약 이미 존재하는 파일에 덧붙이기를 원한다면, 파일 이름 다음에 오는 Boolean 인수를 true로 지정하여 직접 StreamWriter 객체를 생성할 수도 있다.

//텍스프 파일에 덧붙이기
StreamWriter asw = new StreamSwiter("fool.txt", true);
Posted by gsi
:

Exception (예외) 처리

C# 2007. 10. 19. 15:17 |

Exception

C# 에서의 에러 처리는 예외를 사용하여 손쉽게 수행된다. 예외 처리는 에러가 발생할 만한 구문들을 try 블록 안에 넣고, catch 블록에서 에러를 잡는 것이다.

try {
   // 에러가 발생할 만한 구문
}
catch (Exception e) {
   // 에러가 발생했을 때 처리하는 구문
}
finally {
   // 언제나 실행되는 구문
}


이러한 접근 방식은 파일을 다루는 문장에서 에러를 검사하거나, 배열의 범위를 벗어나는 인덱스 문장의 에러를 잡아내는 등의 여러가지 에러 상황을 검사하는 곳에서 사용된다. 이 방법이 동작하는 방식은 일단 try 블록이 실행되고, 여기서 에러가 발생하지 않으면, finally 블록이 실행된다. 만약 try 구문내에서 에러가 발생하면 제어가 catch 구문으로 넘어간 후, finally 블록을 실행하고 밖으로 빠져나가게 된다.

다음 예제는 예외를 검사하는 것을 보여준다. ArrayList 에서 범위를 벗어난 값에 접귾려고 했기 때문에, 에러가 발생할 것이다.

try {
   // 너무 많이 접근한다는 점에 주의 하자
   for(int i = 0; i <= arl.Count; i++)
      console.WriteList(arl[i]);
}
catch (Exception e) {
   Console.WriteList(e.Message);
}


이 코드는 에러 메시지를 출력하고, 프로그램에서 에러가 발생한 부분을 보여주고 계속 실행된다.

0123456789 인덱스가 범위를 벗어났습니다.
인덱스는 음수가 아니어야 하며 컬렉션의 크기보다 작아야 합니다.
매개 변수 이름 : index
   at System.Collections.Arraylist.get_Item(int32 index)
   at arr.Form1..ctor() in form1.cs:line 58

만약 예외를 잡아내지 못하면, 실행중에 시스템으로부터 에러 메시지를 받고, 프로그램은 계속 진행되지 않고 종료될 것이다.

C# 예외 클래스들..

  • AccessException : 클래스의 메서드 또는 필드에 접근할 때의 에러
  • ArgumentException : 메서드의 인수가 유효하지 않음
  • ArgumentNullException : 인수가 null임
  • ArthmeticException : 오버플로우 또는 언더플로우
  • DivideByZeroException : 0으로 나누기
  • IndexOutOfRangeException :배열의 범위를 넘어선 인덱스
  • FileNotFoundException : 파일을 찾을수 없음
  • EndOfStreamException : 입력 스트림의 범위를 넘어선 접근
  • DirectoryNotFoundException : 디렉터리를 찾을 수 없음
  • NullReferenceException : 객체 변수가 실제값으로 초기화 되지 않음

다중 예외
여러 개의 catch 블록에서 여러 개의 예외를 받아 서로 다르게 처리할 수 있다.

try {
   for(int i = 0; i <= arl.Count; i++) {
      int k = (int)(float)arl[i];
      Console.Write(i + "" + k/i);
   }
   catch (DivideByZeroException e) {
      printZErr(e);
   }
   catch (IndexOutOfRangeException e) {
      printOErr(e);
   }
   catch(Exception e) {
      printErr(e);
   }
}


예외 던지기
예외가 발생했다고 해서 바로 그곳에서 처리해야할 필요는 없다. throw 구문을 사용하여 호출한 프로그램에게 예외를 전달할 수 있다. 이것은 호출한 프로그램에서 예외가 발행하게 하는 것이다.

try {
   // 구문
}
catch (Exception e) {
   throw(e);      // 호출한 프로그램에게 전달한다.
}

C#은 자바의 throw 구문을 지원하지 않는다는 것에 주의 하자. 자바에서는 메서드가 예뢰를 던질 것이라는 것을 선언할 수 있으므로, 프로그램에서는 반드시 예외 처리 핸들러를 제공해야 한다.

Posted by gsi
:

Collection 객체

C# 2007. 10. 19. 14:38 |

System.Collections 네임 스페이스에는 여러가지 방법으로 항목을 추가하거나 구할 수 있는 가변 길이의 배열 객체들이 많이 있다.

ArrayList
ArrayList 객체는 필요할 때마다 항목을 추가할 수 있는 가변 길이의 배열로, ArrayList의 기본적인 메서드를 사용하면 쉽게 배열에 요소를 추가하고, 개별 요소를 변경시킬 수 있다.

float[] z = {1.0f, 2.9f, 5.6f};
ArrayList arl = new ArrayList();
for(int j = 0; j < zLength; j++)
{
   arl.Add(z[j]);
}

ArrayList는 배열의 개수를 찾느 데 사용할 수 있는 Count 속성을 갖고 있다. ArrayList를 배열과 같이 취급하여, 0에서 시작하여 Count 속성 값보다 하나 작은 값까지 이동하면서 이들 요소에 접근 할 수 있다.

for(j = 0; j < arl.Count; j++)
{
   Console.WriteList(arl[j]);
}

또한 foreach 루프 구문을 사용하여 인덱스 변수를 생성하거나, ArrayList의 길이를 알지 못하고도  ArrayList 객체의 멤버에 순차적으로 접근 할 수 있다.

foreach(float a in arl)
{
   Console.WriteList(a);
}

ArrayList에서 가져온 객체는 항상 object 타입이다. 따라서 우리는 그것을 사용하기 전에 반드시 정확한 타입으로 변환해야 한다.

float x = (float)arl[j];

ArrayList 메서드

  • Clear :  ArrayList 안에 있는 모든 내용을 삭제한다.
  • Contains(object) : ArrayList가 해당하는 값을 가지고 있으면 true를 반환한다.
  • CopyTo(array) : ArrayList의 모든 내용을 일차원 배열에 복사한다.
  • IndexOf(object) : 해당하는 값의 첫번째 인덱스를 반환한다.
  • Insert(index, object) : 정해진 인덱스에 요소를 삽입힌다.
  • Remove(object) : 목록에서 지정된 객체를 삭제한다.
  • RemoveAt(index) : 지정된 위치에서 요소를 삭제한다.
  • Sort : ArrayList를 정렬한다.


HashTable

HashTable은 각각의 요소들을 키 값으로 접근할 수 있는 가변 길이의 배열이다. 일반적으로 키 값은 문자열로 지정하지만, 어떤 객체로 지정해도 상관이 없다. 각각의 요소는 중복되는 값이 있어도 상관없지만, 그 키 값은 반드시 유일해야 한다. HashTable은 크고 정렬되지 않은 항목들의 집합에 빠르게 접근하는 데 사용되고, 키와 요소의 값을 역순으로 함으로써 요소가 중복되지 않는 것을 보장하기 위해 사용되기도 한다.

HashTable hash = new HashTable();
float freddy = 12.3f;
hash.Add("fread", freddy);
float tmp = (float)hash["fread"];

ArrayList 에서와 같이 HashTable에서 구한 갑도 만드시 적절한 타입으로 변환해서 사용해야 한다. 또한, HashTable도 Count 속성을 가지고 있으므로 클래스의 키 또는 값들의 개수를 알아낼 수 있다.

SortedList
SortedList 클래스는 두 개의 내부 배열을 관리하며, 0부터 시작하는 인덱스와 알파벳 키 중 하나를 사용하여 요소를 구할 수 있다.

float sammy = 44.5f;
ShortedList slist = new SortedList();
slist.Add("fred", freddy);
slist.Add("sam", sammy);
float newFred = (float)slist.GetByIndex(0);
float newSam = (float)slist["sam"];
Posted by gsi
: