C#에서는 System.IO 네임스페이스를 활용하여 텍스트 파일과 바이너리 파일 등 다양한 형식의 파일을 손쉽게 읽고 쓸 수 있습니다. 이 글에서는 두 가지 대표적인 파일 읽기 방법을 예제 코드와 함께 자세히 살펴보겠습니다.
1. StreamReader를 이용한 텍스트 파일 읽기
텍스트 파일을 한 줄씩 읽어 화면에 출력하는 기본적인 예제입니다. StreamReader 클래스의 ReadLine() 메서드를 사용하면 파일의 끝(EOF)에 도달할 때까지 줄 단위로 데이터를 읽을 수 있습니다.
예제 코드
using System;
using System.IO;
namespace FileApplication {
class Program {
static void Main(string[] args) {
try {
using (StreamReader sr = new StreamReader("d:/new.txt")) {
string line;
// 파일의 끝에 도달할 때까지 한 줄씩 읽어 출력합니다.
while ((line = sr.ReadLine()) != null) {
Console.WriteLine(line);
}
}
} catch (Exception e) {
// 오류 발생 시 사용자에게 알립니다.
Console.WriteLine("파일을 읽을 수 없습니다:");
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
}
}실행 결과
파일을 읽을 수 없습니다: Could not find a part of the path "/home/cg/root/4281363/d:/new.txt".
위 실행 결과는 지정한 경로에 파일이 존재하지 않아 발생한 오류 메시지입니다. 이처럼 try-catch 블록으로 예외를 처리하면 파일이 없거나 접근 권한이 없는 경우에도 프로그램이 비정상 종료되지 않습니다. 또한 using 문을 사용하면 파일 리소스가 자동으로 해제되므로 메모리 누수를 방지할 수 있습니다.
2. BinaryReader/BinaryWriter를 이용한 바이너리 파일 읽기
바이너리 파일은 정수, 실수, 불리언, 문자열 등 다양한 데이터 타입을 그대로 저장하고 읽을 수 있습니다. 아래 예제는 BinaryWriter로 데이터를 파일에 기록한 후, BinaryReader로 다시 읽어오는 전체 과정을 보여줍니다.
예제 코드
using System.IO;
namespace BinaryFileApplication {
class Program {
static void Main(string[] args) {
BinaryWriter bw;
BinaryReader br;
int i = 25;
double d = 3.14157;
bool b = true;
string s = "I am happy";
// 파일 생성
try {
bw = new BinaryWriter(new FileStream("mydata", FileMode.Create));
} catch (IOException e) {
Console.WriteLine(e.Message + "\n 파일을 생성할 수 없습니다.");
return;
}
// 파일에 데이터 쓰기
try {
bw.Write(i);
bw.Write(d);
bw.Write(b);
bw.Write(s);
} catch (IOException e) {
Console.WriteLine(e.Message + "\n 파일에 쓸 수 없습니다.");
return;
}
bw.Close();
// 파일에서 데이터 읽기
try {
br = new BinaryReader(new FileStream("mydata", FileMode.Open));
} catch (IOException e) {
Console.WriteLine(e.Message + "\n 파일을 열 수 없습니다.");
return;
}
try {
i = br.ReadInt32();
Console.WriteLine("정수 데이터: {0}", i);
d = br.ReadDouble();
Console.WriteLine("실수 데이터: {0}", d);
b = br.ReadBoolean();
Console.WriteLine("불리언 데이터: {0}", b);
s = br.ReadString();
Console.WriteLine("문자열 데이터: {0}", s);
} catch (IOException e) {
Console.WriteLine(e.Message + "\n 파일에서 읽을 수 없습니다.");
return;
}
br.Close();
Console.ReadKey();
}
}
}핵심 정리
텍스트 파일은 사람이 읽을 수 있는 문자 데이터를 다룰 때 적합하며, StreamReader의 ReadLine()으로 간편하게 처리할 수 있습니다. 반면 바이너리 파일은 이미지, 실행 파일처럼 용량 효율이 중요한 데이터를 저장할 때 유용하며, BinaryWriter와 BinaryReader를 사용해 데이터 타입별로 직렬화·역직렬화할 수 있습니다. 두 방식 모두 FileStream과 함께 사용되며, 예외 처리와 리소스 해제(using 문 또는 Close() 호출)를 반드시 신경 써야 안정적인 파일 입출력을 구현할 수 있습니다.