PDF giáo trình lập trình C từ cơ bản đến nâng cao của Phạm Công Ngô Đầu thế kỷ XXI, Microsoít đite ra một bộ Visual Studio ,NET (VS 7.0),Có thể nói từ vs 2001 đến vs 2003 đã có một bước cải tiến đảng kể vểnội dung, Bộ Visual Studio 6.0 (với các ngôn ngữ Visual Basic 6.0, VisualC++ 6.0, ASP 3.0,...
Trang 1ChươNq 8 F ì I es
giống như mọi ngôn ngữ khác Có hai cách ghi và đọc dử liệu vào íiles; kiểu file íext và kiểu file nhị phân
8. 1 G H I / Đ Ọ C F I L E T E X T
ỉ<hi viết chương trinh để luu dữ liệu vảo fi!e, ta phải thêm dòng tiêu đề;
using System.10;
8.1.1 Ghi d ữ liệu v ã o file
Cú pháp để ghi dữ liệu vào íile:
s t r in g filenaine = ” c ; \ \ C S \ \ t e s t ĩ t x t
StreamWriter sw = new StreamVỉriter (filename)
sw.Write("This i s the t e x t " ) ;
Sau khi ghi xong cần phải đóng file lại
sw.Close () ;
8.1.2 Đ ọ c dO liệu tù file
ị
s t r in g filenaiTte “ " c : \ \ c s \ \ t e s t l txt" ;
StreamReader s r l = new StreamReader {filen am e);
s r l C l o s e O ;
^ V i à ụ S l
using System;
using System.10;
u sin g System.Text;
c i a s s PileT ext
s t a t i c s t r in g f i l e l * * ' c : \ \ t e s t f i l e t x t ” ;
s t a t i c doxible a * 123.456;
• s t a t i c i n t b * 789;
s t a t i c châr kt *
Trang 2s t a t i c v o id Main(stríng( ] args)
{
using (StreamVỉriter sw = new StreêưnWriter ( f i l e l ) )
{
sw.Write {•'This i s a t e x t ; a “ ");
sw.W riteLine(â);
sw.WriteLine (b );
sví.VíriteLine ( k t ) ; sw.Close ();
ì
StreamReader s r l " new S tr e a m R ea đ e r (file l);
s t r in g input;
w h ile ((in p u t = srl.R ea d L in e( ) ) ! = n u ll)
C onsoĩe.W riteLine(input);
)
Console.WriteLine("Ket th u c !")!
s r l C i o s e ();
C onsole ReađLine{) ;
} }
This ỉs a text; a - 123.456
789
M
Ket thuc
Chú ý: Một cách khác đ ể ghi d ữ iiệu vào file Tniớc hếỉ phải khai
báo biến file:
StreanMriter sw;
Tạo tìle text nhờ hàm CreateYextQ:
s t a t l c s t r in g f i l e l * " c : \ \ t e s t f i l e t x t " ;
sw •= F i l e C r e a t e T e x t ( f i l e l ) ;
Trang 3I ?
Ghi dữ liệu vào file:
sw W riteL inerT his i s a t e x t " ) ;
Sau khi ghi xong dữ liệu cần phải đóng file lại
SM.Close 0 ;
Đọc dữliệu từíiie:
Khai báo đối tưỢng file:
StreanReader s r l ;
Mở file:
s t r in g input;
s r l “ F ile O p e n T e x t ( f ile l) ;
Đọc file:
input=srl.ReadToEnd();
Hiển ữiị dữ liệu sau khi đọc:
Console.W riteLíne(input);
Ui dụ 8.2.
using System;
using System.10;
c l a s s FileT ext
{
s t a t i c s t r in g f i i e l = "c : \ \ t e s t f i l e t x t " ;
i
StreamHritec sw; / / ghi du l i e u vao f í l e
sw = F ile C r e a t e T e x t ( f iie l) ;
sw.WriteLine("This i s a t e x t " ) ;
sw.WriteLine{"Dai hoc Bach Khoa Ha N oi.");
sw.WriteLine("Trung tam Genetic Singapore.");
sw.WriteLine(123.456);
SM.Close();
StreamReader s r l ; / / doc du l i e u tu f i l e
/ / =* new StreamReader ( f i l e l ) ;
Trang 4s t r i n g input;
s r l * F i l e O p e n T e x t ( f ile l) ; input « srl.ReadToEnđ0 ;
C on sole.W riteL in e(in p u t);
Console VíriteLine (** The end o f the stream!” );
s r l C l o s e 0 ;
C onsole ReadLine();
} }
H k ể ' í quá:
Thìs is a text Daí hoc Bach Khoa Ha Noi Trung tam Genetic Singapore
123.456
Ta cũng có th ể đọc file tíieo các dòng kế tiếp như đoạn m ã dưới đây:
StreamReader sr;
s t r in g input;
s r “ F i l e O p e n T e x t ( f i l e l ) ; while-(true)
i f ( i n p u t »» n u lĩ) break;
C onsole WriteLine(in p u t);
}
s r C lo s e O ;
s Ví dụ 8.3.
using System;
u sin g System 10; •,
u sin g System.Text;
c l a s s FileT ext
{
s t a t í c s t r in g f i l e l = " c : \ \ t e s t f i i e t x t " ;
104
Trang 5s t a t i c doubie a * 123.456;
s t a t i c void Main (stringỉ ) args)
{
using (5treamWriter sw « new StreamVíriter (f i l e l )
I
sw.WriteLine ( a ) ;
sw.VíriteLine (b );
sw.Clos€ ();
)
StreamReaàer sr;
s t r in g input;
sr « File.OpenText ( f i l e l );
w h ile(tru e)
{
input * sr.R eadLine();
if ( i n p u t “ n u ll) break;
C onsole-W riteLine(input);
1
Console.WriteLíne (’* Ket thuc !'*);
s r.C lo s e 0 ;
C onsoie ReadLine();
quá:
This is a text; a = 123,456
789
M
Ket Ihuc.
Trang 68 2 G H I/Đ Ọ C FILE NHỊ PH Â N
Việc ghi/đọc dữ liệu của file nhị phân có nhiều ưu điểm hcAi ỉile text
vì bảo mật file cao hơn ở đây sỗ trình bày cách ghi/đọc dữ liệu cho một byte và cách ghi/đọc dữ liệu cho một đối tượng chúÈi nhiều trường dữ iiệu
- Ghi dữ liệu vào file kiểu byte:
+ Giả sử ta khai báo một biến mảng kiểu
byte [ ] b l = { 1, 2, 3, 4, 255} ;
+ Khai báo đối tượng để ghì dữ liệu vào file "testbin.dat" ở ổ đĩa C;
F i l e S t r e a m ( " c : \ \ t e s t b i n d a t ” , FileMode.OpenOrCreate,
P ile A c c e s s W r it e , P iỉe S h a r e N o n e );
+ Thựt hiện quá tìình ghi các phần tử của mảng số b l có kiểu byte:
fo reach (b y te bnext in b l) {
sw.W ríteByte(bnext);
} Sau khi ghi xong, ta phải đóng fiie )ại
s w C lo s e ();
- E)ọc dữ liệu từ fi)e kiểu byte;
+ Mở file để đọc:
F ile I n fo f r » new F ile I n fo r c : \ \ t e s t b i n d a t ' ' );
stream strm ■ fr.OpenReađ<);
+ Sử dụng vòng lặp để đọc:
in t i ;
w hile(true)
i - strm.ReadBỵtỹO ;
C o n s o le w r it e r { 0 ,4 ) " , i ) ;
1
+ E>óng file sau khi đọc xong:
strm C lo se{)?
Trang 7& Ví dụ 8.4. Ví dụ này cho phép ta ghi và đọc các số có kiểu byte (giá trị 0 ^ 255)
u sin g System;
u sin g Sỵsteni.IO;
c ỉ a s s P ile b in / / c a c so kieu bỵte
{
s t a t i c v o id Main (stringl ] args)
{
P ile S tr e a m sw = new F ile S tre a m (*'c : \ \ t e s t b i n dat” ,'
foreach (b yte bnext in bl)
í
sw W riteByte(bnext);
sw.Close (>;
/ / Doc đu ĩ i e u tu f i l e
F iie I n f o f * new F ile I n fo (” c : \ \ t e s t b i n dât” );
stream strm » f OpenRead();
i n t i /
w h ile (tr u e )
i = s t r m R e a d B y t e 0 /
i f ( i « -1) breâk/
)
stm ì-C lose {) /
Consoie ReadLine()/
)
}
^ ^ K ể t quả:
255 33 44 55 66
Trang 8Ta có thể thực hiện việc ghi/đọc dữ liệu của nhiều kiểu dữ liệu khác nhau bằng file nhị phân
- Ghi dữ liệu từ íile nhị phân;
s t r i n o f i l e l = " c : \ \ F i l e B i n l d a t " ;
FileStreâfn f i l e l ;
s t r i n g name; //d ữ l i ê u thành viên
/ / khai bảo đ6i tượng wf cho v iê c ghi vào f i l e nhị phán
/ / Các hàm Write {) để g h i từng thảnh vỉén wf,Write(name);
w f.W rite(sa la ry ) /
“ Đọc dữ liệu từ íilc nhị phân:
Khai báo file cần đọc:
riieS trea m f i l e l ; Khai báo đối tưỢng rf cho việc đọc:
BinarỵReađer r f « new B in a r y R e a d e r (filô l);
Các hàm để đọc dữ liệu nhị phân:
name “ rf^ R ead strin g{);
s a la r y « r f ReadDoiable ();
liệu khác nhâu
b y te b l ; b l * rfrP e â d B y te 0 ;
char c h l; c h l « rf.ReadChar();
decimâl d l; d l * rf.ReađDecim al();
double d2; d2 « r f ReadDoưble();
f l o a t f l ; f l » r f R e a d s in g l e 0 ;
i n t a ; a * rf,R e a d In t3 2 ();
long b; b * rf • R e a d ln t6 4 í) ;
s b y te s b l / s b l * r f •ReađSByteO;
u in t u i l ; u i l “ rf-R ead ư ln t32{);
ulong u l l ; u l l = rf.R eadU Int640 ;
108
Trang 9Vi d ụ 8.5.
using System;
using System 10;
c l a s s FiieBin2
(
p r iv a te s t r in g name;
p r iv a te in t age;
p r iv a te double salary;
p u b lic FileBin2()
I
name “
sa la ry = ũ;
}
{
this.name = name;
t h i s a g e * age/
t h i s s â l a r y » Sâlary;
)
public void Inputo
(
Console.Vírite ("\ nNhap ten: **);
name * Console.ReadLine0 ;
Consoỉe W rite("Nhap t u o i : " );
age = Int32»Parse(Console.ReadLine ( ) ) ;
C onsole,W rite("Nhap ĩuong: ” );
sa la r y = Double Parse(ConsoÌe.ReadLine());
)
p u b lic void Show()
Console.WriteLine(’'Ten: *'+name+''; Tuoi: ’.'+age);
Trang 10C on sole.W riteL in eL u on g: **+saLary);
)
p u b lic void SaveData(FileStream f i l e l )
wf.Write (name);
wf Vírite (a g e);
wf W r ite (sa la r y );
}
p u b lic void ReađData(FileStream f i l e l )
{
BinaryReader r f * new B i n a r ỵ R e a đ e r / name « r f ReadStringO
age * r f.R e a đ ln t3 2 0 ;
sa la rỵ * r í ReadDouble();
}
p u b lic void MenuO
{
Console • VíriteLine (" 1, Nhap du l i e u ” );
Console WriteLine <"2• Doc va xem " );
Console WriteLine (” 3 • Thoat” );
Console• WriterNhap so 1 - 3 de lua chon: " );
} )
c l a s s T e s tP ile
{
s t a t i c v o íd Main (string[ ] args)
{
FileBin2 p » new F ileB in 2 ();
Trang 11s t r i n g filenam e = ” c : \\D a t â d a t ’* ;
w h ile (c h o ic e !» ” 3")
{
c h o ic e * Console.ReadLine0 ;
sw itch (ch o ic e)
{
Câse ” 1*’ : Console.WriteLine Save data to
EileStream fwr * new r ile S t r e a m (fiie n a m e ,
EileM ođe C rea te, r i l e A c c e s s Write^ r i l e S h a r e W r ite );
p » new F ileB in 2 ();
p SaveData(fwr);
fw r.C lose 0 ;
break;
c a se ” 2": Consoie.WriteLine ("Read dâtâ from f i l e ” );
F ile A c c e s s R e a d , r i l e S h a r e R e a đ ) /
p »,new F ileB in 2 ();
p,R eađ D ata(fr)r
p Show(>;
break;
c a se ” 3" : continue;
}
MENU
1 Nhap du lleu
Trang 123 Thoat
Nhap so 1 - 3 de lua chon: 1 Save daĩa to file
Nhap ten: Hoa Nhap tuoi; 22 Nhap luong: 1000
MENU
1 Nhap du líeu
2 Doc va xem
3 Thoat
Nhap so 1 - 3 de lua chon: 2 Read data from file
Ten: Hoa; Tuoi; 22 Luong: 1000
Việc ghi/đọc bằng file nhị phân có thể ử>ụt hiện cho một mảng đối íuọng Mỗi đối tuỵng lại bao gồm nhiểu kiểu dữ liệu thành phần khác nhau
Ví d ụ 8 6 Viết chutữìg trinh để lưu dử iiệu vào file
using System;
u sin g System 10;
c l a s s FileB in3
,í
p r iv â t e s t r in g nâine;
p r iv a t e i n t age;
p r iv a t e double salary;
p u b lic FileB in3()
Trang 13sa la r y * 0;
t
public voíd Inputo
I
C o n s o l e W r i t e c * \ n H h a p t e n : ' * ) ;
name = Console.ReadLine 0 ;
Cofisole,Write (”Tuoi: '*);
age = Int32.Parse(Consoie.ReâdLine( ) ) ;
Console,Write Luong: *');
Sâlary = Double.Pârse(Conscle.ReadLine0 ) ;
}
p u b l i c v o i d S h o w ( )
(
C o n so le M r ite L in e D o c du iie u tu
Console WriteLine("Luong: "+ sa lâ r y );
)
p u b l i c v o i d S a v e D â t a ( r ỉ i e S t r e a m
BinaryVĩriter wf = new BinarỵWriter ( f i l e l ) ;
w f W r i t e < n a m e ) ;
wf Vírite <âge);
w f.W r ite (sa la r y );
p u b l i c v o i d R e a đ D a t a ( F i l e S t r e a m f i l e l )
{
BinaryReader r f * new BinarỵReader ( f i l e l ) ;
age = rf.R e a d ln t3 2 ();
S â l a r ỵ « r f • R e a d D o u b l e { > ;
Trang 14c l â s s T e s t r ile
s t a t i c void Main (stringC ] args)
i n t n;
Ccnsole.VíriteTNhap n *
n » Iĩìt32.Parse(Console^ReadLine( ) ) ; FileBiiì3 [] p = new FileBin3[ n) ;
s tr in g filename » ” c:\\Data.đat**;
Con$ole.WriteLineCGhi du l i e u vao f i i e ” );
FileStream fwr * new FileStream (filenam e, FileMode.Create,
F ileA ccess,W rite/ F ileS h are.w rit e ) ;
f o r ( i n t i * 0; i < n; i++)
{
i] * new FileBin3 ();
Ịi i) ,Input 0 ; f( i] SaveData (fwr);
1
fw r.C lose () /
/ /
-Console,W riteLine{’* Doc du l í e u tu f i l e ” );
FileBin3 [ ] p i “ new FileBini^ n] ; rileStream f r = new FileStream (filenam e, rileMode.Open, PileAccess.Read, r ile S h â r e Read);
f o r ( i n t i * 0; i < n; i++)
{
pK i) “ new F ile B ín 3 ();
pl[ i} ReadĐata(fr);
pl[ i] Show() ;
}
Console ReadLine ();
} )
114
Trang 15^ ^ K ể t quả:
Nhap n = 2
Ghi du lieu vao fìle
Nhap ten: Mai
Tuoi: 22
Luong: 1000
Nhap ten: Ha
Tuoi: 35
Luong: 2000
Doc du lieu tu fìle
Ten: Mai: Tuoi: 22
Luong: 1000
Doc du lieu tu file
Ten; Ha; Tuoi; 32
Luong; 2000
G v i dụ 8 7 Xây dựng m ột menu để th ụ t hiện các thao tác: Nhập, liệt
kê, xoá, sửa tim kiêm, bổ sung
using System; //C o n so ie A p p lica tio n
c l a s s person
i
p r iv a te s t r in g narne;
p r iv a te long ID;
p r iv a te i n t age;
/ /
ĨD = 0;
/ /
Trang 16public s t a t i c i n t n;
/ / -
-pubĩic void InputO
I
f o r ( i n t i = 0 ; i < n; Ì++)
( p( i] = new p erso n O ;
Console WriteLine ("person { 0) " , i ) ; Console.VỉriteLine ("Enter name: " );
p( i] name = Console.ReadLine 0 ; Console.WriteLine("Enter ID: ");
p( iỊ ID = Int64 Parse (Console.ReadLíne 0 ) ; Console.KriteLine("Enter age: ");
p; i] age = Int32 Parse (Console.ReađLine {)) ; ì
} / / -
-pidDlic void Show()
t
f o r ( i n t i * 0; i < n;
CcnsOÌe.WEiteLine("Name:{ 0) ; ID:{ 1} ; age: {2 }" , F<i].nairae,
p{ i] ID, ri i] age) ;
1
-public void SearchNameO
(
s tr in g namel;
Consoie.VIrite ("Enter nante t o search: ” );
namel “ Console.ReadLine();
f o r ( i n t i * 0 ; i < n; i++)
{
i f (String.Ccsnpare (namel, F( i] name) ** 0)
116
Trang 17C o n so le.V ỉriteL in e ("Name; f CỊ ; ID: ( l } ; a g e : 12}",
p[ i] naine, p{ ij ID , p[ i] a g e );
}
)
/ / - -
-p ublic void SearchlDO
i
long id l;
C onsole.W rite("Enter ID to search: ” );
i d l = In t6 4 Parse{Consoie.ReadLine());
f o r ( i r t i = Ũ; i < n; i++)
{
i f (íd l “= p( i] ID)
Consoie VỈriteLine (" Narre: { 0 } ; ID: I 1} ; age : { 2 } ",
p l i ỉ n a ĩ r e , p [ i ] , I D , p ( i ] a g e ) ;
)
}
/ /
-p u b lic void D eleteO
{
long id l;
C onsole.W rite("Enter ID to search: ");
i d l = In t64 Parse(Console.ReadLine());
f o r ( i n t i = 0; i < n; Ì++I
{
i f (id l == FÍ il -ID)
{
Console.VỉriteLine (" Name:i 0} ; ID:{ 1) ; age: {2}", p( i] name,
p i] ID, p( i) age) ;
w h ile ( i < n)
{
i) = p( i+ i] ; i++;
Trang 18n = n - i ;
/ / - -
-public void E d i t o
{
s t r in g namel;
C onsole.W rite("E nter name to sea rch : ” );
namel * Console.ReadLine();
f o r ( i n t i = 0; i < n; i++)
{
i f (String.Ccxnpare (namel,p( ij name) == 0)
í
C on sole.V íriteL in e {" Narae: ( 0 ) ; ID: { 1 } ; age: { 2 ) " ,
Pí i] name, p [ i ] I D , p [ i ] a g e ) ;
Console.KriteLine {" person { 0) ” , i) ; Console.W riteLine("Enter name: ” );
p{ i] name “ Console ReaoLine () ;
C onsole.K riteL inerE nter ID: '•);
Console.WriteLine(” Enter age: ");
p( i) age - Int32.Parse(Console.ReadLine {)) ;
} / /
-p u b lic v o id A -p -penđO
I
p( nl “ new personO ; Console WriteLine C’ Enter name: ” );
fị n] name * Console.ReadLine 0 ;
118