Slide
Làm việc với tập tin văn bản.pdf
Lý thuyết
Đọc và ghi file text trong C# — Tổng quan
Trong C#, bạn có thể làm việc với các file văn bản (.txt) bằng cách sử dụng các lớp được cung cấp trong namespace System.IO. Những lớp này giúp bạn mở, đọc và ghi nội dung file một cách dễ dàng.
Lớp StreamReader — Đọc nội dung từ file
StreamReader được thiết kế để đọc dữ liệu dạng văn bản từ một file. Khi sử dụng StreamReader, bạn có thể duyệt từng dòng trong file cho tới khi hết nội dung.
Nói vềConstructor (hàm khởi tạo) StreamReader, ta có:
StreamReader(string path): Khởi tạo với đường dẫn file (mặc định dùng UTF-8, buffer 1024 byte).
StreamReader(string path, Encoding encoding): Chỉ định file và mã hóa cụ thể.
StreamReader(Stream stream): Nhận một đối tượng Stream (ví dụ: FileStream), dùng UTF-8 và buffer 1024 byte.
StreamReader(Stream stream, Encoding encoding): Nhận Stream và mã hóa, tự động gọi Dispose() trên Stream gốc khi StreamReader được giải phóng.
// Đọc file bằng đường dẫn, dùng UTF-8
StreamReader reader1 = new StreamReader(“C:\\path\\to\\file.txt”);
// Đọc file với mã hóa khác (ví dụ: ASCII)
StreamReader reader2 = new StreamReader(“C:\\path\\to\\file.txt”, System.Text.Encoding.ASCII);
Một số phương thức của lớp này là:
1 public override void Close(): Nó đóng đối tượng StreamReader và Underlying Stream, và giải phóng bất kỳ nguồn hệ thống nào được liên kết với Reader đó
2 public override int Peek(): Trả về ký tự có sẵn tiếp theo nhưng không hủy nó
3 public override int Read(): Đọc ký tự tiếp theo từ Input Stream và tăng vị trí ký tự thêm 1
Ví dụ đọc file:
using (StreamReader sr = new StreamReader("textfile.txt"))
{
string line;
// doc va hien thi cac dong trong file cho toi
// khi tien toi cuoi file.
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
Console.ReadKey();
}
catch (Exception e)
{
// thong bao loi.
Console.WriteLine("Khong the doc du lieu tu file da cho: ");
Console.WriteLine(e.Message);
}
//Chú ý nếu truyền vào mà không có thư mục gì, ví dụ "textfile.txt", thì file này phải nằm trong thư mục cùng với file chạy của chương trình. Còn không thì ta truyền đường dẫn đầy đủ, ví dụ "D:\textfile.txt", "E:\trang\baihoc\textfile.txt".
Lớp StreamWriter trong C#
Constructor của StreamWriter
StreamWriter(string path)
StreamWriter(string path, bool append)
StreamWriter(string path, bool append, Encoding encoding)
StreamWriter(string path, bool append, Encoding encoding, int bufferSize)
StreamWriter(Stream stream)
StreamWriter(Stream stream, Encoding encoding)
StreamWriter(Stream stream, Encoding encoding, int bufferSize)
Lớp StreamWriter trong C# kế thừa từ lớp abstract là TextWriter mà biểu diễn một Writer để ghi một dãy ký tự.
Bảng dưới miêu tả các phương thức được sử dụng phổ biến của lớp StreamWriter trong C#:
STT Phương thức
1 public override void Close(): Đóng đối tượng StreamWriter hiện tại và Underlying Stream
2 public override void Flush(): Xóa tất cả buffer cho Writer hiện tại và làm cho bất kỳ dữ liệu được đệm nào để được ghi tới Underlying Stream
3 public virtual void Write(bool value): Ghi biểu diễn text của một giá trị Boolean tới Text string hoặc stream (được kế thừa từ TextWriter)
4 public override void Write(char value): Ghi một ký tự tới Stream
5 public virtual void Write(decimal value): Ghi biểu diễn text của một giá trị thập phân tới Text string hoặc stream
6 public virtual void Write(double value): Ghi biểu diễn text của một giá trị số thực 8 byte tới Text string hoặc stream
7 public virtual void Write(int value): Ghi biểu diễn text của một giá trị signed integer 4 byte tới Text string hoặc stream
8 public override void Write(string value): Ghi một string tới Stream
9 public virtual void WriteLine(): Ghi một line terminator tới Text string hoặc stream
Dưới đây là ví dụ minh họa cách ghi dữ liệu text vào trong một file bởi sử dụng lớp StreamWriter trong C#:
Chúng ta tiến hành ghi dữ liệu vào monan.txt trống rồi sau đó tiến hành đọc và hiển thị dữ liệu trên màn hình.
Console.WriteLine("Vi du minh hoa doc va ghi File trong C#");
Console.WriteLine("---------------------------------");
string[] names = new string[] { "Bun dau mam tom chua ngot", "Banh canh cha ca hai san trung muoi" };
using (StreamWriter sw = new StreamWriter("D:\monan.txt"))
{
foreach (string s in names)
{
sw.WriteLine(s);
}
}
// doc va hien thi du lieu trong monan.txt
string line = "";
using (StreamReader sr = new StreamReader("monan.txt"))
{
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
Console.ReadKey();
Sau đây là cách Ghi thêm dữ liệu vào file dùng StreamWriter
string[] themvao = new string[] { "Ca ri ga xao ot hiem kem tuoi", "Socola sot buoi" };
using (StreamWriter sw = new StreamWriter(@"D:\monan.txt",true))
{
foreach (string s in themvao)
{
sw.WriteLine(s);
}
}
Bài tập thực hành
Bài 1. Tạo một mảng có chứa 3 phần tử chuỗi là “Toi yeu ky thuat lap trinh”, “Toi say me hoc CSharp”, “Toi se duoc 10 diem” và ghi vào file có tên là names.txt trong ổ đĩa D:\
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = "names.txt";
string[] names = new string[] { "Toi yeu ky thuat lap trinh", "Toi say me hoc CSharp", "Toi se duoc 10 diem" };
// Write to the file using StreamWriter
using (StreamWriter sw = new StreamWriter(filePath))
{
foreach (string s in names)
{
sw.WriteLine(s);
}
}
// Read and show each line from the file using StreamReader
string line = "";
using (StreamReader sr = new StreamReader(filePath))
{
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
}
Bài 2. Kiểm tra Password
Viết chương trình đ ọc vào 1 file “ Password.txt ” chứa các chuỗi 𝑠 là các mật khẩu . Hãy kiểm tra mỗi mật khẩu có thỏa các tất cả các ràng buộc sau hay không ?
▪ Có ít nhất 8 ký tự
▪ Phải chứa ký tự thường, ký tự hoa và ký tự số
Chương trình cần đảm bảo được những yêu cầu sau:
▪ Yêu cầu người dùng nhập vào đường dẫn của thư mục chứ file “Password.txt ”.
▪ Mở file “Password.txt ” theo đường dẫn trên để đọc dữ liệu ? Nếu file không tồn tại thông báo lỗi “ File not found! ” và yêu cầu nhập lại đường dẫn khác.
▪ Khi đọc file thành công, tiến hành kiểm tra các mật khẩu và ghi kết quả vào file “Password Validation .txt” đặt trong cùng thư mục với file “ Password.txt ”, dưới dạng: Password : Yes/No (Yes: hợp lệ, No: không hợp lệ )
▪ Đóng các luồng đọc, ghi file đang mở.
Ví dụ
Password.txt có nội dung sau
abc123456
123456789
Abcd12
Abcd123456
PasswordValidation .txt có nội dung sau
abc123456 : No
123456789 : No
Abcd12 : No
Abcd123456 : Yes
Console.WriteLine("Input directory of file Password.txt");
string fileDirectory = new string("");
do
{
fileDirectory = Console.ReadLine();
if(!(File.Exists(fileDirectory + "\\Password.txt")))
Console.WriteLine("File not found! Input right directory");
}
while (!(File.Exists(fileDirectory + "\\Password.txt")));
string[] passwords = System.IO.File.ReadAllLines(fileDirectory + "\\Password.txt");
using (StreamWriter sw = File.CreateText(fileDirectory + "\\PasswordValidation.txt"))
foreach (string pass in passwords)
{
if (pass.Length>=8 && pass.Any(char.IsDigit) && pass.Any(char.IsLetter) && pass.Any(char.IsUpper) && pass.Any(char.IsLower))
sw.WriteLine(pass + " " + "yes");
else
sw.WriteLine(pass + " " + "no");
}
Bài tập 3. Tách họ tên
Viết chương trình đọc vào 1 file “ Name s.txt” chứa các chuỗi Họ Tên (các từ cách nhau bởi 1 ký tự khoảng trắng) . Hãy viết chương trình tách chuỗi Họ Tên thành 3 phần : Họ, Tên lót và Tên.
Yêu cầu về việc đọc, ghi file tương tự như Bài tập 1 . Định dạng dữ liệu như ví dụ bên dưới:
Ví dụ
Names.txt có chứa nội dung sau
Trần Thành Công
Nguyễn Ngọc Quỳnh Hoa
SplitNames.txt có chứa nội dung sau
Trần Thành Công
– Họ: Trần
– Tên lót: Thành
– Tên: Công
Nguyễn Ngọc Quỳnh Hoa
– Họ: Nguyễn
– Tên lót: Ngọc Quỳnh
– Tên: Hoa
string[] lines = System.IO.File.ReadAllLines(@"E:\huflit\aa2021 2022\nhập môn lập trình\Names.txt");
TimHoTenLot(lines);
}
static void TimHoTenLot(string[] array)
{
using (StreamWriter sw = File.CreateText(@"E:\huflit\aa2021 2022\nhập môn lập trình\SplitNames.txt"))
{
foreach (string input in array)
{
sw.WriteLine(input);
string[] words = input.Split();
if (words.Length == 0)
{
sw.WriteLine("- Chuỗi rỗng.");
}
else
{
sw.WriteLine("- Họ: " + words[0]);
if (words.Length >= 3)//nếu có từ 3 từ trở lên thì in tên lót
{
sw.Write("- Tên lót: ");
for (int i = 1; i < words.Length - 1; i++)
{
sw.Write(words[i] + " ");
}
sw.WriteLine();
}
else
sw.WriteLine("- Không có tên lót");
if (words.Length >= 2)//nếu có từ 2 từ trở lên thì in tên)
sw.Write("- Tên: " + words[words.Length - 1]);
else
sw.WriteLine("- Không có tên");
}
sw.WriteLine();
}
}
Bài tập 4. Robot đi theo hướng đông, tây, nam, bắc
Một Robot xuất phát từ điểm có tọa độ (𝑋𝑆,𝑌𝑆) trong m ặt ph ẳng tọa độ nguyên 𝑂𝑋𝑌 , mỗi lần Robot đi đư ợc một đơn v ị độ dài theo m ột trong 4 hư ớng: Đông ( 𝐷), Tây ( 𝑇), Nam ( 𝑁), Bắc (𝐵).
Yêu cầu: Viết chương trình điểu khiển Robot đi theo câu l ệnh là m ột chuỗi s gồm các ký t ự 𝐷,𝑇,𝑁,𝐵 (1≤𝑙𝑒𝑛𝑔𝑡 ℎ(𝑠)≤10000 ). Hãy in vị trí của Robot (tọa độ) sau mỗi bước đi. (Đọc, ghi dữ liệu vào file).
Input
• Dòng thứ nhất chứa hai số nguyên x,y là toạ độ ban đầu của Robot.
• Dòng thứ hai chứa câu lệnh để chỉ đường cho rô bốt đi, ví dụ DTTBBTDN.
Output
• Nhiều dòng, mỗi dòng lần lượt là vị trí của Robot sau mỗi bước đi.
string[] tokens = Console.ReadLine().Split();
int x = int.Parse(tokens[0]);
int y = int.Parse(tokens[1]);
string dir = Console.ReadLine();
using (StreamWriter sw = File.CreateText(@"E:\huflit\aa2021 2022\nhập môn lập trình\Moves.txt"))
{
sw.WriteLine(x + " " + y);
for (int i = 0; i<dir.Length; i++)
{
if (dir[i] == 'D') //sang phải
x++;
else if (dir[i] == 'N') //xuống dưới
y--;
else if (dir[i] == 'T') //sang trái
x--;
else if (dir[i] == 'B') //lên trên
y++;
sw.WriteLine(x + " " + y);
}
}
Bài tập làm thêm vào buổi 2
Bài 5
Trong ổ đĩa D:\, folder hocvui, có 3 file như sau, các file có tên là DiemToan.txt, DiemVan.txt, DiemTiengAnh.txt, trong đó có sẵn dữ liệu như sau:
DiemToan.txt có chứa:
Nguyen Van Tung 10
Banh Thi Han Han 9
To Van An 8
DiemVan.txt có chứa:
Nguyen Van Tung 6
Banh Thi Han Han 4
To Van An 7
DiemTiengAnh.txt có chứa:
Nguyen Van Tung 7
Banh Thi Han Han 2
To Van An 10
Lúc này ko tồn tại file TongDiem.txt
Hãy viết đoạn code sao cho code đọc nội dung từ 3 file này, sau đó copy nội dung tất cả các file DiemToan.txt, DiemVan.txt, DiemTiengAnh.txt để ghi vào file TongDiem.txt, ngoài ra trong file TongDiem.txt còn chứa thêm điểm trung bình của từng bạn. Túm lại trong file TongDiem.txt sẽ chứa nội dung như sau:
Điểm toán là:
Nguyen Van Tung 10
Banh Thi Han Han 9
To Van An 8
—————————–
Điểm văn là:
Nguyen Van Tung 6
Banh Thi Han Han 4
To Van An 7
—————————–
Điểm tiếng anh là:
Nguyen Van Tung 7
Banh Thi Han Han 2
To Van An 10
—————————
Điểm trung bình là:
Nguyen Van Tung 7.66
Banh Thi Han Han 5
To Van An 10 8.3
Bài 6
Ứng dụng ghi đọc file để làm mini game chơi cờ caro, tùy em sáng tạo, cô hướng dẫn như sau, em có thể làm khác đi:
Tạo một file text tên là BanCoCaro.txt, trong đó có chứa tình hình bàn cờ, ví dụ
Bàn cờ trắng
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
Đi con đầu tiên
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | o | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
Đi thêm con nữa
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | x | | | |
+---+---+---+---+---+
| | | o | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | x | x | o | |
+---+---+---+---+---+
| | | o | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
Chương trình của con sẽ cho xen kẽ Người chơi O, Người chơi X nhập tọa độ, ví dụ
Mời người chơi O nhập (từ bàn phím): 3,1 thì sẽ ra
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | x | x | o | |
+---+---+---+---+---+
| | | o | | |
+---+---+---+---+---+
| | o | | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
Gợi ý: Thì em sẽ lưu bàn cờ lại, chủ yếu là lưu dưới dạng ma trận kiểu string 2 chiều M[5,5], ban đầu thì toàn bộ các phần tử đều bằng “trong” (trống), khi Người chơi x đi thì tại tọa độ đó có giá trị “x”, người chơi O đi tại tọa độ nào thì tại đó có chứa giá trị “o”.
Khi nào muốn dừng chơi thì bấm “dung”.
Yêu cầu của cô là khi tắt chương trình thì thế trận bàn cờ được lưu lại trong file BanCoCaro.txt
Bài 7: Làm game mìn (Minesweeper), gợi ý tạo ma trận 2 chiều tùy kích thước, giá trị 0 là ko có mìn, giá trị 1 là có mìn. Thêm 1 ma trận 2 chiều nữa để chứa giá trị có mở ô chưa, 0 là chưa mở, 1 là đã mở rồi. Khi mở thì ta so với vị trí đó ở ma trận đầu tiên là có mìn/ ko có mìn,… Sau mỗi bước nếu chưa thua thì in ra thế trận game, còn nếu thua thì in ra game over. Ghi vào file thế trận game nếu đang chơi mà dừng lại. Đầu game có hỏi là chơi game mới hay mở lại game trong file.