using System;
using System.IO; // 파일 입출력을 위한 네임스페이스
/*
.NET은 텍스트 파일을 쓰고 읽을 수 있도록 StreamWriter/StreamReader 클래스를 제공합니다.
바이너리 파일을 쓰고 읽을 수 있도록 BinaryWriter/BinaryReader 클래스를 제공한 것과 같음.
*/
// StreamWriter/StreamReader 클래스를 사용하여,
// 다양한 데이터 타입의 값을 텍스트 파일("a.txt")에 쓰고 읽는 프로그램
namespace TextFile
{
class MainApp
{
static void Main(string[] args)
{
using (StreamWriter sw =
new StreamWriter( // FileStream 객체를 사용하여 StreamWriter 객체를 생성합니다.
// StreamWriter는 FileStream을 통해 파일에 접근하고 데이터를 씁니다.
new FileStream("a.txt", FileMode.Create))) // "a.txt"라는 텍스트 파일을 생성하고,
// 쓰기 모드로 여는 FileStream 객체(스트림)를 생성합니다.
// 이 객체는 StreamReader 객체에 전달되어,
// StreamReader가 파일에 텍스트를 쓸 수 있도록 합니다.
// 만약 파일이 이미 존재하면 기존 내용을 덮어씁니다.
{
// Write() 메서드와 WriteLine() 메서드는 C#이 제공하는 모든 기본 데이터 형식에 대해 오버로딩되어 있습니다.
sw.WriteLine(int.MaxValue); // int 최댓값을 파일에 씀
sw.WriteLine("Good morning!"); // 문자열 "Good morning!"을 파일에 씀
sw.WriteLine(uint.MaxValue); // uint 최댓값을 파일에 씀
sw.WriteLine("안녕하세요!"); // 문자열 "안녕하세요!"를 파일에 씀
sw.WriteLine(double.MaxValue); // double 최댓값을 파일에 씀
} // using 블록 종료 시 sw.Close() 자동 호출
using (StreamReader sr =
new StreamReader(
new FileStream("a.txt", FileMode.Open))) // "a.txt" 파일을 열고 StreamReader 객체 sr를 사용하여 파일에서 읽을 수 있도록 합니다.
// using 문을 사용하면 sr 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 파일이 닫힙니다.
{
Console.WriteLine($"File size : {sr.BaseStream.Length} bytes"); // 파일 크기 출력
while (sr.EndOfStream == false) // 파일의 끝에 도달할 때까지 반복
{
Console.WriteLine(sr.ReadLine()); // 파일에서 한 줄씩 읽어서 출력
}
} // using 블록 종료 시 sr.Close() 자동 호출
}
}
}
/*
출력 결과
File size : 82 bytes
2147483647
Good morning!
4294967295
안녕하세요!
1.7976931348623157E+308
*/
코드 설명
using System;
using System.IO; // 파일 입출력을 위한 네임스페이스
namespace TextFile
{
class MainApp
{
static void Main(string[] args)
{
using (StreamWriter sw = new StreamWriter(new FileStream("a.txt", FileMode.Create))) // "a.txt" 파일을 생성하고 StreamWriter로 연결
{
sw.WriteLine(int.MaxValue); // int 최댓값을 파일에 씀
sw.WriteLine("Good morning!"); // 문자열 "Good morning!"을 파일에 씀
sw.WriteLine(uint.MaxValue); // uint 최댓값을 파일에 씀
sw.WriteLine("안녕하세요!"); // 문자열 "안녕하세요!"를 파일에 씀
sw.WriteLine(double.MaxValue); // double 최댓값을 파일에 씀
} // using 블록 종료 시 sw.Close() 자동 호출
using (StreamReader sr = new StreamReader(new FileStream("a.txt", FileMode.Open))) // "a.txt" 파일을 열고 StreamReader로 연결
{
Console.WriteLine($"File size : {sr.BaseStream.Length} bytes"); // 파일 크기 출력
while (sr.EndOfStream == false) // 파일의 끝에 도달할 때까지 반복
{
Console.WriteLine(sr.ReadLine()); // 파일에서 한 줄씩 읽어서 출력
}
} // using 블록 종료 시 sr.Close() 자동 호출
}
}
}
코드 설명
이 C# 코드는 StreamWriter와 StreamReader를 사용하여 다양한 데이터 타입의 값을 텍스트 파일("a.txt")에 쓰고 읽는 예제입니다.
StreamWriter: 텍스트 형식으로 데이터를 파일에 쓰는 클래스입니다.StreamReader: 텍스트 형식으로 파일에서 데이터를 읽는 클래스입니다.Main 메서드
using (StreamWriter sw = new StreamWriter(new FileStream("a.txt", FileMode.Create))): "a.txt" 파일을 생성하고 StreamWriter 객체 sw를 사용하여 파일에 쓸 수 있도록 합니다. using 문을 사용하면 sw 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 파일이 닫힙니다.sw.WriteLine(int.MaxValue);: int 타입의 최댓값을 파일에 씁니다.sw.WriteLine("Good morning!");: 문자열 "Good morning!"을 파일에 씁니다.sw.WriteLine(uint.MaxValue);: uint 타입의 최댓값을 파일에 씁니다.sw.WriteLine("안녕하세요!");: 문자열 "안녕하세요!"를 파일에 씁니다.sw.WriteLine(double.MaxValue);: double 타입의 최댓값을 파일에 씁니다.using (StreamReader sr = new StreamReader(new FileStream("a.txt", FileMode.Open))): "a.txt" 파일을 열고 StreamReader 객체 sr를 사용하여 파일에서 읽을 수 있도록 합니다. using 문을 사용하면 sr 객체를 사용한 후 자동으로 Close() 메서드가 호출되어 파일이 닫힙니다.Console.WriteLine($"File size : {sr.BaseStream.Length} bytes");: 파일의 크기를 바이트 단위로 출력합니다.while (sr.EndOfStream == false): 파일의 끝에 도달할 때까지 반복합니다.Console.WriteLine(sr.ReadLine());: 파일에서 한 줄씩 읽어서 출력합니다.출력 결과
File size : 74 bytes
2147483647
Good morning!
4294967295
안녕하세요!
1.7976931348623157E+308
FileStream 객체?
FileStream 객체는 "a.txt" 파일 자체가 아니라, "a.txt" 파일을 조작하기 위한 객체입니다.
FileStream 객체는 파일을 열고, 읽고, 쓰고, 닫는 등의 작업을 수행할 수 있도록 해주는 객체입니다.
이 코드에서 new FileStream("a.txt", FileMode.Create)는 "a.txt" 파일을 생성하고 쓰기 모드로 여는 FileStream 객체를 생성합니다. 이 객체는 StreamWriter 객체에 전달되어 StreamWriter가 파일에 텍스트를 쓸 수 있도록 합니다.
FileStream 객체는 익명 형식이 아니고, 이름이 없습니다.
익명 형식은 new { Name = "John", Age = 30 }과 같이 이름 없이 정의하는 형식입니다. FileStream 객체는 FileStream 클래스의 인스턴스이며, 익명 형식이 아닙니다.
이 코드에서 FileStream 객체는 변수에 할당되지 않았기 때문에 이름이 없습니다. 하지만 FileStream 객체를 변수에 할당하면 변수 이름을 통해 객체에 접근할 수 있습니다.
FileStream fileStream = new FileStream("a.txt", FileMode.Create);
이 코드에서는 fileStream이라는 변수에 FileStream 객체를 할당했습니다. 이제 fileStream 변수를 통해 FileStream 객체에 접근할 수 있습니다.
using (StreamWriter sw = new StreamWriter(new FileStream("a.txt", FileMode.Create))) 이 부분을 단계별로 자세히 설명.
1단계: 파일 생성 및 열기
new FileStream("a.txt", FileMode.Create) 부분은 "a.txt"라는 이름의 파일을 생성하고 쓰기 모드로 엽니다. 만약 "a.txt" 파일이 이미 존재한다면, 기존 내용을 지우고 새롭게 덮어씁니다.
FileStream 클래스는 '파일을 읽고 쓰는 데 사용'되는 클래스입니다. 생성자의 첫 번째 매개변수는 '파일 경로', 두 번째 매개변수는 '파일 모드'를 나타냅니다. FileMode.Create는 파일을 생성하고 쓰기 모드로 여는 모드입니다.
2단계: StreamWriter 객체 생성
new StreamWriter(...) 부분은 StreamWriter 클래스의 객체를 생성합니다. StreamWriter는 텍스트 형식으로 데이터를 파일에 쓰는 데 사용되는 클래스입니다. 즉, 문자열을 파일에 쓸 때 사용합니다.
StreamWriter 생성자의 매개변수로 FileStream 객체를 전달합니다. 이는 StreamWriter가 FileStream을 통해 파일에 접근하고 데이터를 쓰도록 하기 위함입니다.
3단계: using 문
using (StreamWriter sw = ...) 부분은 using 문을 사용하여 StreamWriter 객체를 생성합니다. using 문은 StreamWriter 객체를 사용한 후 자동으로 Close() 메서드를 호출하여 파일을 닫습니다. 이는 파일을 열고 사용한 후 명시적으로 닫지 않아 발생할 수 있는 리소스 누수를 방지하는 데 도움이 됩니다.
요약
new FileStream("a.txt", FileMode.Create): "a.txt" 파일을 생성하고 쓰기 모드로 엽니다.new StreamWriter(...): FileStream 객체를 사용하여 StreamWriter 객체를 생성합니다.using (StreamWriter sw = ...): using 문을 사용하여 StreamWriter 객체를 생성하고, 사용 후 자동으로 파일을 닫습니다.이 코드는 StreamReader 클래스를 사용하여 "a.txt" 파일의 내용을 읽어오기 위한 객체 sr을 생성하고, using 문을 사용하여 파일을 자동으로 닫는 역할을 합니다.
StreamReader는 텍스트 파일을 읽어오는 데 특화된 클래스입니다. 즉, 파일에서 문자열을 읽어올 때 사용합니다.
이 코드는 다음과 같은 단계로 실행됩니다.
new FileStream("a.txt", FileMode.Open): "a.txt" 파일을 읽기 모드(FileMode.Open)로 엽니다. 파일이 존재하지 않으면 예외가 발생합니다.
new StreamReader(...): FileStream 객체를 사용하여 StreamReader 객체를 생성합니다. StreamReader는 FileStream을 통해 파일에 접근하고 데이터를 읽어옵니다.
using (StreamReader sr = ...): StreamReader 객체 sr을 using 문으로 감싸서, using 블록을 벗어날 때 자동으로 sr.Close() 메서드가 호출되도록 합니다. 이는 파일을 사용한 후 명시적으로 닫지 않아 발생할 수 있는 리소스 누수를 방지하는 데 도움이 됩니다.
요약하자면, 이 코드는 "a.txt"라는 텍스트 파일을 열고, StreamReader 객체를 사용하여 파일의 내용을 읽어올 수 있도록 준비합니다. using 문을 사용하여 파일을 자동으로 닫아 리소스 누수를 방지합니다.