Giáo trình C++ - Chương 3: Nhập và xuất dữ liệu

Ch−¬ng 3 : NhËp vµ xuÊt d÷ liÖu  
§1. Kh¸i niÖm chung  
1. Kh¸i niÖm :Tr−íc ®©y chóng ta ®· xÐt viÖc nhËp d÷ liÖu tõ bµn phÝm. Trong nhiÒu tr−êng  
hîp thùc tÕ , ®Ó thuËn lîi , chóng ta ph¶i nhËp d÷ liÖu tõ c¸c tËp tin trªn ®Üa . C¸c hµm th−  
viÖn cña C cho phÐp truy cËp tËp tin vµ chia lµ 2 cÊp kh¸c nhau :  
- c¸c hµm cÊp 1 lµ c¸c hµm ë cÊp thÊp nhÊt , truy cËp trùc tiÕp ®Õn c¸c tËp tin trªn  
®Üa.C kh«ng cung cÊp vïng nhí ®Öm cho c¸c hµm nµy  
- c¸c hµm cÊp 2 lµ c¸c hµm truy xuÊt tËp tin cao h¬n , do chóng ®−îc C cung cÊp  
vïng nhí ®Öm  
§èi víi c¸c hµm cÊp 1 , tËp tin ®−îc xem lµ khèi c¸c byte liªn tôc do ®ã khi muèn  
truy cËp mÉu tin cô thÓ th× ph¶i tÝnh to¸n ®Þa chØ cña mÉu tin vµ nh− vËy c«ng viÖc vÊt v¶  
h¬n . Ngoµi ra ph¶i cung cÊp vïng nhí ®Öm cho kiÓu ®äc ghi nµy. §èi víi c¸c hµm cÊp hai  
c«ng viÖc nhÑ nhµng h¬n do :  
- tr×nh biªn dÞch tù ®éng cung cÊp vïng kÝ øc ®Öm cho chóng  
- cã thÓ truy xuÊt c¸c mÉu tin mµ kh«ng gÆp khã kh¨n nh− víi c¸c hµm cÊp 1  
Trong C , c¸c th«ng tin cÇn thiÕt cho c¸c hµm xuÊt nhËp cÊp 2 ®−îc ®Æt trong tËp tin  
stdio.h cßn c¸c th«ng tin vÒ hµm nhËp xuÊt cÊp 1 th× ë trong tËp tin io.h  
2. Stream vµ c¸c tËp tin : Ta ph¶i ph©n biÖt hai thuËt ng÷ lµ stream vµ file .HÖ thèng xuÊt  
nhËp cña C cung cÊp mét kh«ng gian t−ëng t−îng gi÷a ng−êi lËp tr×nh vµ c¸c thiÕt bÞ ®−îc  
dïng . CÊp trung gian t−ëng t−îng nµy gäi lµ stream vµ thiÕt bÞ cô thÓ lµ tËp tin .  
a. C¸c streams : Trong m¸y tÝnh ta dïng 2 lo¹i stream : v¨n b¶n vµ nhÞ ph©n . Mét  
stream v¨n b¶n lµ mét lo¹t kÝ tù ®−îc tæ chøc thµnh dßng mµ mçi dßng ®−îc kÕt thóc b»ng  
kÝ tù xuèng dßng newline(“\n”) . Khi ghi , mét kÝ tù chuyÓn dßng LF(m· 10) ®−cî chuyÓn  
thµnh 2 kÝ tù CR( m· 13) vµ LF . Khi ®äc 2 kÝ tù liªn tiÕp CR vµ LF trªn tËp tin chØ cho ta  
mét kÝ tù LF .  
Mét stream nhÞ ph©n lµ mét lo¹t c¸c byte .  
a. C¸c tËp tin : Trong C ,mét tËp tin lµ mét kh¸i niÖm logic mµ hÖ thèng cã thÓ ¸p  
dông cho mäi thø tõ c¸c tËp tin trªn ®Üa cho ®Õn c¸c terminal .  
Khi b¾t ®Çu thùc hiÖn  
ch−¬ng tr×nh , m¸y tÝnh më 3 stream v¨n b¶n ®· ®−îc ®Þnh nghÜa tr−íc lµ stdin , stdout vµ  
stderr . §èi víi hÇu hÕt c¸c hÖ thèng , c¸c thiÕt bÞ nµy lµ console  
§2. NhËp xuÊt chuÈn  
1. NhËp xuÊt kÝ tù , chuçi kÝ tù , ®Þnh d¹ng vµ b¶n ghi : NhËp xuÊt cÊp 2(nhËp xuÊt chuÈn  
) cung cÊp 4 c¸ch ®äc vµ ghi d÷ liÖu kh¸c nhau (ng−îc l¹i nhËp xuÊt c©p1 chØ dïng 1 trong 4  
c¸ch nµy) .  
Tr−íc hÕt d÷ liÖu cã thÓ ®äc ghi mçi lÇn mét kÝ tù , t−¬ng tù nh− c¸ch lµm viÖc cña  
putchar() vµ getche() ®Ó ®äc d÷ liÖu tõ bµn phÝm vµ hiÓn thÞ lªn mµn h×nh .  
Thø hai , d÷ liÖu cã thÓ nhËp xuÊt theo chuçi b»ng c¸c dïng c¸c hµm gets() vµ puts()  
Thø ba , d÷ liÖu cã thÓ ®−îc nhËp vµ xuÊt theo khu«n d¹ng b»ng c¸c hµm fprintf() vµ  
fscanf()  
Thø t− , d÷ liÖu ®−îc ®äc vµ ghi theo khèi cã chiÒu dµi cè ®Þnh th−êng dïng l−u tr÷  
m¶ng hay cÊu tróc b»ng c¸c hµm fread() vµ fwrite() . Tãm l¹i :  
C¸c hµm dïng chung cho hai kiÓu nhÞ ph©n vµ v¨n b¶n  
fopen : dïng më tËp tin  
21  
fclose : ®ãng tËp tin  
fclose : ®ãng tÊt c¶ c¸c tËp tin  
fflush : dïng lµm s¹ch vïng ®Öm cña tËp tin  
flushall : dïng lµm s¹ch vïng ®Öm cña tÊt c¶ tËp tin  
ferror : cho biÕt cã lçi (kh¸c kh«ng) hay kh«ng cã lçi ( b»ng 0)  
perror : thong b¸o lçi trªn mµn h×nh  
foef : cho biÕt cuèi tËp tin hay ch−a  
unlink vµ remove : dïng ®Ó lo¹i tËp tin trªn ®Üa  
fseek : di chuyÓn con trá ®Õn vÞ trÝ bÊt k× trªn tËp tin  
ftell : cho biÕt vÞ trÝ hiÖn t¹i cña con trá  
C¸c hµm nhËp xuÊt kÝ tù  
putc vµ fputc : nhËp kÝ tù vµo tËp tin  
getc vµ fgetc : ®äc kÝ tù tõ tËp tin  
fprintf : dïng ghi d÷ liÖu ®Þnh d¹ng lªn tËp tin  
fscanf : dïng ®äc d÷ liÖu ®Þnh d¹ng tõ tËp tin  
fputs : dïng ghi chuçi lªn tËp tin  
fgets : dïng ®äc chuçi tõ tËp tin  
C¸c hµm dïng cho kiÓu xuÊt nhËp nhÞ ph©n  
putw : dïng ghi mét sè nguyªn hai byte lªn tËp tin  
gets : dïng ®äc mét sè nguyªn hai byte tõ tËp tin  
fwrite : dïng ghi mét mÉu tin lªn tËp tin  
fread : dïng ®äc mét mÉu tin tõ tËp tin  
2.D¹ng v¨n b¶n vµ d¹ng nhÞ ph©n : C¸ch kh¸c ®Ó ph©n lo¹i c¸c thao t¸c nhËp xuÊt tËp tin  
lµ nã ®−îc më theo kiÓu v¨n b¶n hay nhÞ ph©n . §iÓm kh¸c biÖt gi÷a hai lo¹i nµy lµ kÝ tù  
newline vµ end of line . §iÓm thø hai ®Ó ph©n biÖt hai kiÓu tËp tin lµ lµ c¸ch l−u tr÷ c¸c sè  
vµo ®Üa . §èi víi d¹ng v¨n b¶n th× c¸c sè ®−îc l−u tr÷ thµnh chuçi c¸c kÝ tù cßn d¹ng nhÞ  
ph©n th× c¸c sè ®−îc l−u nh− trong bé nhí , nghÜa lµ dïng hai byte cho mét sè nguyªn vµ 4  
byte cho mét sè float .  
3. NhËp xuÊt chuÈn : Ch−¬ng tr×nh dïng c¸c hµm nhËp xuÊt cÊp 2 th−êng dÔ hiÓu h¬n nªn  
chóng ta sÏ nghiªn cøu tr−íc .  
a. NhËp xuÊt kÝ tù : §Ó nhËp kÝ tù vµo tËp tin ta dïng hµm putc() hay fputc().§Ó ®äc  
kÝ tù tõ tËp tin ta dïng hµm getc() hay fgetc() . Ch−¬ng tr×nh vÝ dô nµy lµ t¹o lËp c¸c kÝ tù  
b»ng c¸ch gâ vµo bµn phÝm mçi lÇn mét kÝ tù vµ ghi vµo mét tËp tin trªn ®Üa . Ch−¬ng tr×nh  
dïng hµm fopen() ®Ó më mét tËp tin , dïng hµm putc() ®Ó ghi lªn tËp tin , dïng kÝ tù enter ®Ó  
kÕt thóc ch−¬ng tr×nh .  
Ch−¬ng tr×nh 3-1 :  
#include <stdio.h>  
#include <conio.h>  
void main()  
{
FILE *fp;  
char ch;  
printf(“Nhap cac ki tu : “);  
fp=fopen("textfile","w");  
while ((ch=getche())!='\r')  
putc(ch,fp);  
fclose(fp);  
}
22  
b. Më mét tËp tin : Tr−íc khi ghi mét tËp tin lªn ®Üa ta ph¶i më tËp tin ®ã ®· . §Ó më  
tËp tin , tr−íc hÕt ta ph¶i khai b¸o mét con trá chØ tíi FILE . FILE lµ mét structure chøa  
®ùng c¸c th«ng tin vÒ cÊu tróc cña tËp tin vÝ dô nh− kÝch th−íc , vÞ trÝ cña bé ®Öm d÷ liÖu  
hiÖn hµnh . CÊu tróc FILE ®−îc khai b¸o trong stdio.h nªn ta cÇn include tËp tin nµy . Ngoµi  
ra stdio.h cßn x¸c ®Þnh c¸c tªn vµ c¸c biÕn kh¸c ®−îc dïng trong ch−¬ng tr×nh h−íng ®Õn  
c¸c tËp tin . Do vËy trong ch−¬ng tr×nh ta cã c©u lÖnh :  
FILE *fp ;  
Sau ®ã ta më tËp tin b»ng lÖnh :  
fopen(“textfile”,”w”);  
Khi viÕt nh− vËy sÏ lµm cho hÖ ®iÒu hµnh biÕt lµ më mét tËp tin tªn lµ textfile trong th− môc  
hiÖn hµnh ®Ó viÕt lªn tËp tin ®ã (nhê “w”) . Ta cã thÓ cho tªn ®−êng dÉn ®Çy ®ñ nÕu muèn  
më tËp tin ë th− môc bÊt k× . Hµm fopen() tr¶ vÒ mét con trá chØ ®Õn cÊu tróc FILE cho tËp  
tin vµ con trá nµy ®−îc cÊt gi÷ trong biÕn fp . Chuçi “w” ®−îc gäi lµ kiÓu , nã cã nghÜa lµ  
ghi lªn tËp tin . C¸c kiÓu më tËp tin lµ :  
ꢀ“r”,”rt” më ®Ó ®äc , tËp tin ph¶i cã trªn ®Üa  
ꢀ“w”,”wt” më ®Ó ghi , nÕu trªn ®Üa ®· cã tËp tin th× néi dung bÞ ghi ®Ì , nÕu ch−a cã  
th× tËp tin ®−îc t¹o lËp  
ꢀ“a”,”at” më ®Ó nèi thªm, th«ng tin ®−îc ghi vµo cuèi tËp tin cò nÕu ®· cã tËp tin  
hay t¹o míi tËp tin  
ꢀ“r+”,’’r+t” më ®Ó võa ®äc vµ ghi , tËp tin ph¶i cã trªn ®Üa  
ꢀ“rb” më mét tËp tin ®Ó ®äc theo kiÓu nhÞ ph©n . TËp tin ph¶i cã s½n trªn ®Üa  
ꢀ“r+b” më mét tËp tin ®Ó ®äc theo kiÓu nhÞ ph©n . TËp tin ph¶i cã s½n trªn ®Üa  
ꢀ“w+”,”w+t” më ®Ó võa ®äc vµ ghi , néi dung tËp tin ®· cã trªn ®Üa sÏ bÞ ghi ®Ì lªn  
ꢀ“wb” më ®Ó ghi theo kiÓu nhÞ ph©n , nÕu trªn ®Üa ®· cã tËp tin th× néi dung bÞ ghi  
®Ì , nÕu ch−a cã th× tËp tin ®−îc t¹o lËp  
ꢀ“a+”,”a+t” më ®Ó ®äc vµ nèi thªm , nÕu tËp tin ch−a cã th× nã sÏ ®−îc t¹o ra  
ꢀ“ab” më ®Ó ®äc vµ nèi thªm theo kiÓu nhÞ ph©n , nÕu tËp tin ch−a cã th× nã sÏ ®−îc  
t¹o ra  
c. Ghi lªn tËp tin : Khi tËp tin ®· ®−îc më , ta cã thÓ ghi lªn tËp tin tõng kÝ tù mét  
b»ng c¸ch dïng hµm :  
putc(ch,fp)  
Hµm putc() t−¬ng tù c¸c hµm putch() vµ putchar() . Hµm putc() ghi lªn tËp tin cã cÊu tróc  
FILE ®−îc Ên ®Þnh bëi biÕn fp nhËn ®−îc khi më tËp tin . TiÕn tr×nh ghi ®−îc tiÕn hµnh cho  
®Õn khi nhÊn enter .  
d. §ãng tËp tin : Khi kh«ng ®äc ghi n÷a ta cÇn ®ãng tËp tin . C©u lÖnh ®ãng tËp tin lµ  
:
fclose(fp);  
Ta b¸o cho hÖ thèng biÕt lµ cÇn ®ãng tËp tin chØ bëi fp .  
e. §äc tËp tin : NÕu ta cã thÓ ghi lªn tËp tin th× ta còng cã thÓ ®äc tõ tËp tin . Ta cã vÝ  
dô sau :  
Ch−¬ng tr×nh 3-2 :  
#include <stdio.h>  
#include <conio.h>  
main()  
{
FILE *fp;  
int ch;  
clrscr();  
fp=fopen("textfile","r");  
while ((ch=getc(fp))!=EOF)  
23  
printf("%c",ch);  
fclose(fp);  
getch();  
}
f. KÕt thóc tËp tin : Sù kh¸c nh©u chñ yÕu gi÷a ch−¬ng tr×nh ®äc vµ ghi lµ ch−¬ng  
tr×nh ®äc ph¶i ph©n biÖt ®−îc ®©u lµ kÝ tù EOF . Nã kh«ng ph¶i lµ mét kÝ tù µm lµ mét sè  
nguyªn do hÖ ®iÒu hµnh göi tíi . Khi hÕt tËp tin ta gÆp m· kÕt thóc tËp tin EOF (®Þnh nghÜa  
trong stdio.h b»ng -1 ) vµ hµm foef() cho trÞ kh¸c kh«ng . Ng−êi ta chän -1 lµm m· kÕt thóc  
v× nÕu ch−a gÆp cuèi tËp tin th× sÏ ®äc ®−îc mét byte mµ m· sÏ n»m trong kho¶ng 0-255 .  
Nh− vËy gi¸ trÞ -1 kh«ng trïng víi bÊt k× kÝ tù nµo nµo ®−îc ®äc tõ tËp tin . Trong khi  
ch−¬ng tr×nh ®ang ®äc vµ hiÓn thÞ c¸c kÝ tù th× nã t×m kiÕm mé gi¸ trÞ -1 hay EOF . Khi thÊy  
gi¸ trÞ nµy , ch−¬ng tr×nh sÏ kÕt thóc . Chóng ta dïng mét biÕn nguyªn cÊt gi÷ mét kÝ tù ®äc  
®−îc , do ®ã ta cã thÓ hiÓu dÊu EOF nh− lµ mét trÞ nguyªn cã trÞ lµ -1 . NÕu dïng mét biÕn  
kiÓu char , chóg ta cã thÓ dïng tÊt c¶ c¸c kÝ tù tõ 0..255 - ®ã lµ tæ hîp 8 bit . Do ®ã nÕu dïng  
biÕn nguyªn , ta b¶o ®¶m r»ng chØ cã mét gi¸ trÞ 16 bit lµ -1 , ®ã lµ dÊu EOF .  
g. Sù phiÒn phøc khi më tËp tin : Hai ch−¬ng tr×nh ta tr×nh bµy trªn cã mét lçi tiÓm  
Èn . NÕu tËp tin ®· ®−îc chØ ®Þnh kh«ng më ®−îc th× ch−¬ng tr×nh kh«ng ch¹y . Lçi nµy cã  
thÓ lµ do tËp tin ch−a cã (khi ®äc) hay ®Üa kh«ng cßn ®ñ chç(khi ghi). Do ®ã vÊn ®Ò lµ ph¶i  
kiÓm tra xem tËp tin cã më ®−îc hay kh«ng , nÕu tËp tin kh«ng më ®−îc th× hµm fopen() tr¶  
vÒ trÞ 0(0 lµ NULL trong stdio.h) . Khi nµy C coi ®©y kh«ng ph¶i lµ ®Þa chØ hîp lÖ . Nh− vËy  
ta viÕt l¹i ch−¬ng tr×nh trªn nh− sau  
Ch−¬ng tr×nh 3-3 :  
#include <stdio.h>  
#include <stdlib.h>  
#include <conio.h>  
void main()  
{
FILE *fp;  
int ch;  
clrscr();  
if ((fp=fopen("file","r"))==NULL)  
{
printf("Khong mo duoc tap tin\n");  
getch();  
exit(1);  
}
while ((ch=getc(fp))!=EOF)  
printf("%c",ch);  
fclose(fp);  
}
h. §Õm sè kÝ tù : Kh¶ n¨ng ®äc vµ ghi tËp tin trªn c¬ së c¸c kÝ tù cho phÐp triÓn khai  
mét sè øng dông . Chóng ta xem xÐt ch−¬ng tr×nh ®Õm sè kÝ tù sau :  
Ch−¬ng tr×nh 3-4 :  
#include <stdio.h>  
#include <conio.h>  
main(int argc,char *argv)  
{
FILE *fp;  
24  
char string[8];  
int count = 0;  
clrscr();  
if (argc!=2)  
{
printf("Format c:\<ten chuong trinh> <ten tap tin>");  
getch();  
exit(1);  
}
if ((fp=fopen(argv[1],"r"))==NULL)  
{
printf("Khong mo duoc tap tin\n");  
getch();  
exit(1);  
}
while (getc(fp)!=EOF)  
count++;  
fclose(fp);  
printf("Tap tin %s co %d ki tu",argv[1],count);  
getch();  
}
i. §Õm sè tõ : Ta cã thÓ söa ch−¬ng tr×nh trªn thµnh ch−¬ng tr×nh ®Õm sè tõ .  
Ch−¬ng tr×nh 3-5 :  
#include <stdio.h>  
#include <stdlib.h>  
#include <conio.h>  
main(int argc,char *argv[])  
{
FILE *fp;  
char ch,string[81];  
int count = 0;  
int white=1;  
clrscr();  
if (argc!=2)  
{
printf(" Format c:\<Ten chuong trinh> <tentaptin>\n");  
getch();  
exit(1);  
}
if ((fp=fopen(argv[1],"r"))==NULL)  
{
printf("Khong mo duoc tap tin\n");  
getch();  
exit(1);  
}
while ((ch=getc(fp))!=EOF)  
switch(ch)  
{
case ' ': /*nÕu cã dÊu trèng , dßng míi hay tab*/  
25  
case '\t':  
case '\n': white++;  
break;  
default:if(white)  
{
white=0;  
count++;  
}
}
fclose(fp);  
printf("Tap tin %s co %d tu",argv[1],count);  
getch();  
return 0;  
}
k.Vµo ra chuçi : §äc hay ghi chuçi trªn tËp tin còng t−¬ng tù nh− ®äc hay ghi tõng  
kÝ tù riªng lÎ . Ta xÐt mét ch−¬ng tr×nh ghi chuçi  
Ch−¬ng tr×nh 3-6 :  
#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <conio.h>  
void main()  
{
FILE *fp;  
char string[8];  
clrscr();  
if ((fp=fopen("a.txt","w"))==NULL)  
{
printf("Khong mo duoc tap tin\n");  
getch();  
exit(1);  
}
while (strlen(gets(string))>0)  
{
fputs(string,fp);  
fputs("\n",fp);  
}
fclose(fp);  
}
Trong ch−¬ng tr×nh mçi chuçi kÕt thóc b»ng c¸ch gâ enter vµ kÕt thóc ch−¬ng tr×nh  
b»ng c¸ch gâ enter ë ®Çu dßng míi . Do fputs() kh«ng tù ®éng thªm vµo m· kÕt thóc ®Ó  
chuyÓn dßng míi nªn ta ph¶i thªm vµo tËp tin m· nµy . Ch−¬ng tr×nh ®äc mét chuçi tõ tËp  
tin :  
Ch−¬ng tr×nh 3-7 :  
#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <conio.h>  
void main()  
26  
{
FILE *fp;  
char string[81];  
clrscr();  
if ((fp=fopen("a.txt","r"))==NULL)  
{
printf("Khong mo duoc tap tin\n");  
getch();  
exit(1);  
}
while (fgets(string,81,fp)!=NULL)  
printf("%s",string);  
fclose(fp);  
getch();  
}
Hµm fgets() nhËn 3 ®èi sè : ®Þa chØ n¬i ®Æt chuçi , chiÒu dµi tèi ®a cña chuçi , vµ con  
trá chØ tíi tËp tin .  
l. VÊn ®Ò sang dßng míi : Trong ch−¬ng tr×nh ®Õm kÝ tù ta thÊy sè kÝ tù ®Õm ®−îc  
bao giê còng nhá h¬n sè byte cã trong tËp tin nµy nhËn ®−îc b»ng lÖnh dir cña DOS . Khi ta  
ghi mét tËp tin v¨n b¶n vµo ®Üa , C tù ®éng ghi vµo ®Üa c¶ hai m· CR vµ LF khi gÆp m· sang  
dßng míi “\n” . Ng−îc l¹i khi ®äc tËp tin tõ ®Üa , c¸c m· CR vµ LF ®−îc tæ hîp thµnh m·  
sang dßng míi . Ch−¬ng tr×nh sau minh hoa thªm vÒ kÜ thuËt vµo ra chuçi , néi dung t−¬ng  
tù lÖnh type cña DOS  
Ch−¬ng tr×nh 3-8 :  
#include <stdio.h>  
#include <stdlib.h>  
#include <conio.h>  
main(int argc,char *argv[])  
{
FILE *fp;  
char string[81];  
clrscr();  
if (argc!=2)  
{
printf("Format c:\<ten chuong trinh> <ten tap tin>");  
getch();  
exit(1);  
}
if ((fp=fopen(argv[1],"r"))==NULL)  
{
printf("Khong mo duoc tap tin\n");  
getch();  
exit(1);  
}
while (fgets(string,81,fp)!=NULL)  
printf("%s",string);  
fclose(fp);  
getch();  
return 0;  
27  
}
m. C¸c tËp tin chuÊn vµ m¸y in : Trªn ®©y ta ®· nãi ®Õn c¸ch thøc tiÕp nhËn mét con  
trá tham chiÕu dÕn mét tËp tin trªn ®Üa cña hµm fopen() , C ®Þnh nghÜa l¹i tª chuÈn cña 5 tËp  
tin chuÈn nh− sau :  
Tªn  
ThiÕt bÞ  
in  
ThiÕt bÞ vµo chuÈn (bµn phÝm)  
ThiÕt bÞ ra chuÈn (mµn h×nh)  
ThiÕt bÞ lçi chuÈn (mµn h×nh)  
ThiÕt bÞ phô trî chuÈn(cæng nèi tiÕp)  
ThiÕt bÞ in chuÈn (m¸y in)  
out  
err  
aux  
prn  
Ta cã thÓ dïng c¸c tªn nµy ®Ó truy cËp ®Õn c¸c thiÕt bÞ . Ch−¬ng tr×nh sau dïng hµm fgets(0  
vµ fputs() ®Ó in néi dung mét tËp tin ra m¸y in  
Ch−¬ng tr×nh 3-9 :  
#include <stdio.h>  
#include <stdlib.h>  
#include <conio.h>  
main(int argc,char *argv[])  
{
FILE *fp1,*fp2;  
char string[81];  
clrscr();  
if (argc!=2)  
{
printf("Format c:\<ten chuong trinh> <ten tap tin>");  
getch();  
exit(1);  
}
if ((fp1=fopen(argv[1],"r"))==NULL)  
{
printf("Khong mo duoc tap tin\n");  
getch();  
exit(1);  
}
if ((fp2=fopen("prn","w"))==NULL)  
{
printf("Khong mo duoc may in\n");  
getch();  
exit(1);  
}
while (fgets(string,81,fp1)!=NULL)  
fputs(string,fp2);  
fclose(fp1);  
fclose(fp2);  
getch();  
return 0;  
}
Trong ch−¬ng tr×nh trªn m¸y in ®−îc coi lµ tËp tin cã tªn lµ prn  
28  
n. NhËp xuÊt ®Þnh d¹ng : Tr−íc ®©y ta ®· ®Ò cËp ®Õn nhËp xuÊt kÝ tù . Nh÷ng sè cã  
®Þnh d¹ng còng cã thÓ ghi lªn ®Üa nh− c¸c kÝ tù . Ta xÐt ch−¬ng tr×nh sau  
Ch−¬ng tr×nh 3-10 :  
#include <stdio.h>  
#include <conio.h>  
main()  
{
FILE *p;  
int i,n;  
float x[4],y[4];  
clrscr();  
p=fopen("test.txt","w");  
printf("Cho so cap so can nhap n = ");  
scanf("%d",&n);  
fprintf(p,"%d\n",n);  
printf("Cho cac gia tri x va y\n");  
for (i=0;i<n;i++)  
{
scanf("%f%f",&x[i],&y[i]);  
fprintf(p,"%f %f\n",x[i],y[i]);  
}
fclose(p);  
}
#include <stdio.h>  
#include<conio.h>  
#include <string.h>  
void main()  
{
FILE *fp;  
char name[40];  
int code;  
float height;  
int n,i;  
clrscr();  
fp=fopen("b.txt","w");  
printf("Cho so nguoi can nhap : ");  
scanf("%d",&n);  
for (i=0;i<n;i++)  
{
printf("Nhap ten , ma so va chieu cao : ");  
scanf("%s%d%f",name,&code,&height);  
fprintf(fp,"%s %d %f",name,code,height);  
}
fclose(fp);  
}
Ch−¬ng tr×nh 3-11 :  
#include <stdio.h>  
#include <conio.h>  
29  
void main()  
{
FILE *p;  
int i,n;  
float x[4],y[4];  
clrscr();  
p=fopen("test.txt","r");  
fscanf(p,"%d",&n);  
for (i=0;i<n;i++)  
{
fscanf(p,"%f%f",&x[i],&y[i]);  
printf("\n%.3f%8.3f",x[i],y[i]);  
}
fclose(p);  
getch();  
}
#include <stdio.h>  
#include<conio.h>  
#include <string.h>  
void main()  
{
FILE *fp;  
char name[2];  
int code,n,i;  
float height;  
clrscr();  
fp=fopen("b.txt","r");  
fscanf(fp,"%d",&n);  
for (i=0;i<n;i++)  
{
fscanf(fp,"%s%d%f\n",name,&code,&height);  
printf("%s%3d%8.3f\n",name,code,height);  
}
fclose(fp);  
getch();  
}
§3. KiÓu nhÞ ph©n vµ kiÓu v¨n b¶n  
1. M· sang dßng theo hai kiÓu : Trong d¹ng v¨n b¶n , mét kÝ tù chuyÓn dßng t−¬ng øng  
víi 2 m· CR vµ LF khi ghi vµo tËp tin trªn ®Üa . Ng−îc l¹i khi ®äc , tæ hîp CR/LF trªn ®Üa  
t−¬ng øng víi kÝ tù sang dßng míi . Tuy nhiªn nÕu më tËp tin theo kiÓu nhÞ ph©n th× 2 m·  
CR vµ LF lµ ph©n biÖt nhau . Tõ ®ã sè kÝ tù mµ ch−¬ng tr×nh ®Õm ®−îc kh¸c víi tr−êng hîp  
më tËp tin b»ng kiÓu v¨n b¶n  
Ch−¬ng tr×nh 3-12 : Ch−¬ng tr×nh ®Õm sè kÝ tù b»ng c¸ch më tËp tin theo kiÓu nhÞ ph©n  
#include <stdio.h>  
#include <stdlib.h>  
30  
#include <conio.h>  
void main(int argc,char *argv[])  
{
FILE *fp;  
char string[81];  
int count=0;  
clrscr();  
if (argc!=2)  
{
printf("Format c:\<ten chuong trinh> <ten tap tin>");  
getch();  
exit(1);  
}
if ((fp=fopen(argv[1],"rb"))==NULL)  
{
printf("Khong mo duoc tap tin\n");  
getch();  
exit(1);  
}
while (getc(fp)!=EOF)  
count++;  
fclose(fp);  
printf("Tap tin %s co %d ki tu",argv[1],count);  
getch();  
}
2. M· kÕt thóc tËp tin theo 2 kiÓu : Sù kh¸c biÖt thø hai khi më tËp tin theo kiÓu nhÞ ph©n  
hay kiÓu kÝ tù cßn lµ ë chç nh×n nhËn kÝ tù kÕt thóc tËp tin . Nãi chung c¸c tËp tin ®Òu ®−îc  
qu¶n lÝ theo kÝch th−íc cña nã vµ khi ®äc hÕt sè byte ®· chØ ra trong kÝch th−íc tËp tin th×  
dÊu hiÖu EOF sÏ ®−îc th«ng b¸o , dÊu hiÖu ®ã øng víi m· 1Ah(hay 26 ë hÖ 10) . Khi ®ãng  
tËp tin v¨n b¶n , m· 1A sÏ ®−îc tù ®éng chÌn vµo cuèi tËp tin ®Ó lµm dÊu hiÖu kÕt thóc tËp  
tin (t−¬ng ®−¬ng m· Ctrl-Z) . Do vËy nÕu b»ng c¸h nµo ®ã ta chÌn m· 1A vµo mét vÞ trÝ gi÷a  
tËp tin , th× khi më tËp tin theo kiÓu v¨n b¶n vµ ®äc ®Õn m· nµy ch−¬ng tr×nh ®äc sÏ ngõng  
h¼n v× chÝnh lóc ®ã hµm ®äc ph¸t sinh gi¸ trÞ -1 ®Ó b¸o cho ch−¬ng tr×nh lµ ®· kÕt thóc tËp  
tin . NÕu ®· l−u sè vµo tËp tin theo d¹ng nhÞ ph©n th× khi më tËp tin cÇn ph¶i më theo d¹ng  
nhÞ ph©n . NÕu kh«ng sÏ cã mét sè nµo ®ã lµ 1A vµ viÖc ®äc tËp tin theo kiÓu v¨n b¶n sÏ kÕt  
thóc ngoµi ý ®Þnh . T−¬ng tù , víi tËp tin më theo kiÓu nhÞ ph©n m· 10 kh«ng ®−îc nh×n  
nhËn lµ m· sang dßng míi v× kh«ng ®−îc xem lµ t−¬ng øng víi tæ hîp CR/LF n÷a.  
3. Ch−¬ng tr×nh minh ho¹ : Chóng ta xÐt mét ch−¬ng tr×nh dïng kiÓu nhÞ ph©n ®Ó kh¶o s¸t  
tËp tin .  
Ch−¬ng tr×nh 3-13 :  
#include <stdio.h>  
#include <stdlib.h>  
#include <conio.h>  
#define length  
#define true 0  
#define false -1  
10  
void main(int agrc,char *argv[])  
{
31  
FILE *fp;  
int ch;  
int j,noteof;  
unsigned char string[length+1];  
clrscr();  
if (agrc!=2)  
{
printf("Dang c:\<ten chuong trinh> <ten tap tin>");  
getch();  
exit(1);  
}
if ((fp=fopen(argv[1],"rb"))==NULL)  
{
printf("Khong mo duoc tap tin\n");  
getch();  
exit(1);  
}
noteof=true;  
do  
{
for (j=0;j<length;j++)  
{
if ((ch=getc(fp))==EOF)  
noteof=false;  
printf("%3x",ch);  
if (ch>31)  
*(string+j)=ch;/* ki tu in duoc*/  
else  
*(string+j)='.';/* ki tu khong in duoc*/  
}
*(string+j)='\0';  
printf(" %s\n",string);  
}
while (noteof==true);  
fclose(fp);  
getch();  
}
4. C¸c hµm fread vµ fwrite :  
a. Ghi cÊu tróc b»ng fwrite : Ta xÐt mét ch−¬ng tr×nh ghi cÊu tróc lªn ®Üa . Trong  
ch−¬ng tr×nh ta dïng hµm fread() . Hµm nµy cã 4 ®èi sè : ®Þa chØ ®Ó ghi cÊu tróc , kÝch th−íc  
cña cÊu tróc , sè cÊu tróc sÏ ghi vµ con trá chØ tíi tËp tin .  
Ch−¬ng tr×nh 3-14 :  
#include <stdlib.h>  
#include <stdio.h>  
#include <conio.h>  
void main()  
{
char chso[10];  
FILE *fp;  
32  
struct nguoi {  
char ten[30];  
int so;  
float cao;  
}nv;  
clrscr();  
if((fp=fopen("nhanvien.rec","wb"))==NULL)  
{
printf("Khong mo duoc file\n");  
getch();  
exit(1);  
}
do  
{
printf("\nCho ten : ");  
gets(nv.ten);  
printf("Cho ma so : ");  
gets(chso);  
nv.so=atoi(chso);  
printf("Cho chieu cao :");  
gets(chso);  
nv.cao=atof(chso);  
fwrite(&nv,sizeof(nv),1,fp);  
printf("Tiep tuc khong y/n?");  
}
while(getch()=='y');  
fclose(fp);  
}
b. §äc cÊu tróc b»ng fread : Ta dïng hµm fread() ®Ó ®äc cÊu tróc ghi trªn mét tËp  
tin . C¸c ®èi sè cña fread() còng gièng nh− fwrite() . Hµm fread() tr¶ vÒ sè cña nh÷ng môc  
®· ®−îc ®äc tíi . NÕu tËp tin ®· kÕt thóc nã cho trÞ ©m . Ta xÐt vÝ dô sau :  
Ch−¬ng tr×nh 3-15 :  
#include <stdlib.h>  
#include <stdio.h>  
#include <conio.h>  
void main()  
{
FILE *fp;  
struct nguoi {  
char ten[30];  
int so;  
float cao;  
}nv;  
clrscr();  
if((fp=fopen("nhanvien.rec","rb"))==NULL)  
{
printf("Khong mo duoc file\n");  
getch();  
exit(1);  
}
33  
do  
{
printf("\nTen :%s\n",nv.ten);  
printf("Ma so :%03d\n",nv.so);  
printf("Chieu cao :%.2f\n",nv.cao);  
}
while (fread(&nv,sizeof(nv),1,fp)==1);  
fclose(fp);  
getch();  
}
c. Ghi m¶ng b»ng fwrite() : Hµm fwrite() còng dïng ghi m¶ng lªn ®Üa . Ta xÐt vÝ dô  
sau :  
Ch−¬ng tr×nh 3-16 :  
#include <stdio.h>  
#include <conio.h>  
#include <stdlib.h>  
int table[10]={1,2,3,4,5,6,7,8,9,10};  
void main()  
{
FILE *fp;  
clrscr();  
if((fp=fopen("table.rec","wb"))==NULL)  
{
printf("Khong mo duoc file\n");  
getch();  
exit(1);  
}
fwrite(table,sizeof(table),1,fp);  
fclose(fp);  
}
d. §äc m¶ng b»ng fread() : Sau khi ghi m¶ng lªn ®Üa ta cã thÓ ®äc c¸c phÇn tö cña  
m¶ng tõ ®Üa b»ng hµm fread().  
Ch−¬ng tr×nh 3-17 :  
#include <stdio.h>  
#include <conio.h>  
#include <stdlib.h>  
void main()  
{
FILE *fp;  
int a[10];  
int i;  
clrscr();  
if((fp=fopen("table.rec","rb"))==NULL)  
{
34  
printf("Khong mo duoc file\n");  
getch();  
exit(1);  
}
for (i=0;i<10;i++)  
{
fread(a,sizeof(a),10,fp);  
printf("\%3d",a[i]);  
}
fclose(fp);  
getch();  
}
e. VÝ dô vÒ c¬ së d÷ liÖu : Ta xÐt ch−¬ng tr×nh qu¶n lÝ nh©n viªn víi c¸c tËp tin trªn  
®Üa nh− sau :  
Ch−¬ng tr×nh 3-18 :  
#include <stdlib.h>  
#include <stdio.h>  
#include <conio.h>  
#define true 1  
struct nguoi {  
char ten[30];  
int so;  
float cao;  
};  
struct nguoi nv[10];  
int n=0;  
char numstr[10];  
void main()  
{
char ch;  
void newname(void);  
void listall(void);  
void wfile(void);  
void rfile(void);  
clrscr();  
while (true)  
{
printf("\nGo 'e' de nhap nhan vien moi\n");  
printf("Go 'l'de liet ke nhan vien\n");  
printf("Go 'w' de ghi len dia\n");  
printf("Go 'r'de doc file tu dia\n");  
printf("Go 'q' de ket thuc chuong trinh\n\n");  
ch=getch();  
switch (ch)  
{
case 'e':newname();  
break;  
case 'l':listall();  
35  
break;  
case 'w':wfile();  
break;  
case 'r':rfile();  
break;  
case 'q': exit(1);  
default : printf("Nhap sai ki tu , chon lai!");  
}
}
}
void newname()  
{
char numstr[81];  
printf("\nBan ghi so %d\nCho ten : ",n+1);  
gets(nv[n].ten);  
printf("Cho ma so co 3 chu so : ");  
gets(numstr);  
nv[n].so=atoi(numstr);  
printf("Cho chieu cao :");  
gets(numstr);  
nv[n++].cao=atof(numstr);  
}
void listall()  
{
int j;  
if (n<1)  
printf("Danh sach rong\n");  
for (j=0;j<n;j++)  
{
printf("\nBan ghi so %d\n",j+1);  
printf("Ten :%s\n",nv[j].ten);  
printf("Ma nhan vien : %3d\n",nv[j].so);  
printf("Chieu cao :%4.2f\n",nv[j].cao);  
}
}
void wfile()  
{
FILE *fp;  
if (n<1)  
{
printf("Danh sach rong , khong ghi\n");  
getch();  
exit(1);  
}
if ((fp=fopen("nv.rec","wb"))==NULL)  
{
printf("Khong mo duoc file\n");  
getch();  
36  
exit(1);  
}
else  
{
fwrite(nv,sizeof(nv[0]),n,fp);  
fclose(fp);  
printf("Da ghi %3d ban ghi len dia\n",n);  
}
}
void rfile()  
{
FILE *fp;  
if ((fp=fopen("nv.rec","rb"))==NULL)  
{
printf("Khong mo duoc file\n");  
getch();  
exit(1);  
}
else  
{
while(fread(&nv[n],sizeof(nv[n]),1,fp)==1)  
{
clrscr();  
printf("Ban ghi so %3d\n",n+1);  
printf("Ten nhan vien :%s\n",nv[n].ten);  
printf("Ma nhan vien :%3d\n",nv[n].so);  
printf("Chieu cao cua nhan vien :%.2f\n",nv[n].cao);  
getch();  
n++;  
}
fclose(fp);  
printf("Xong ! Tong so ban ghi da doc %3d\n",n);  
}
}
§4. C¸c file ngÉu nhiªn  
C¸c tËp tin ®Ò cËp tr−íc ®©y lµ c¸c tËp tin tuÇn tù , nghÜa lµ tËp tin mµ khi ®äc hay ghi  
®Ò theo chÕ ®é tuÇn tù tõ ®Çu ®Õn cuèi tËp tin . §èi víi tËp tin tuÇn tù ta kh«ng thÓ ®äc hay  
ghi mét c¸ch trùc tiÕp t¹i mét vÞ trÝ bÊt k× trªn tËp tin . TËp tin ngÉu nhiªn cho phÐp ta truy  
cËp ngÉu nhiªn vµo nh÷ng vÞ trÝ cÇn thiÕt trªn tËp tin . C¸c hµm dïng khi truy cËp tËp tin  
ngÉu nhiªn lµ :  
rewind() : di chuyÓn con trá tËp tin vÒ ®Çu tËp tin  
Có ph¸p : void rewind(FILE *fp);  
fseek() : di chuyÓn con trá tËp tin vÒ vÞ trÝ mong muèn  
Có ph¸p : int fseek(FILE *fp , long sb , int xp)  
fp - con trá tËp tin  
sb - sè byte cÇn di chuyÓn  
37  
xp - vÞ trÝ xuÊt ph¸t mµ viÖc dÞch chuyÓn ®−cî b¾t ®Çu tõ ®ã . xp cã thÓ cã c¸c  
gi¸ trÞ sau :  
xp=SEEK_SET hay 0 : xuÊt p¸ht tõ ®Çu tËp tin  
xp=SEEK_CUR hay 1 : xuÊt ph¸t tõ vÞ trÝ con trá hiÖn t¹i  
xp=SEEK_END hay 2 : xuÊt p¸ht tõ cuèi tËp tin  
ftell() : cho biÕt vÞ trÝ hiÖn t¹i cña con trá tËp tin  
Ta xÐt ch−¬ng tr×nh vÝ dô sau :  
Ch−¬ng tr×nh 3-19 :  
#include <stdlib.h>  
#include <stdio.h>  
#include <conio.h>  
void main()  
{
struct nguoi {  
char ten[30];  
int so;  
float cao;  
}nv;  
int recno;  
FILE *fp;  
long int offset;  
clrscr();  
if ((fp=fopen("nhanvien.rec","r"))==NULL)  
{
printf("Khong mo duoc file\n");  
getch();  
exit(1);  
}
printf("Ban muon doc ban ghi thu may : ");  
scanf("%d",&recno);  
recno--;  
offset=recno*sizeof(nv);  
if (fseek(fp,offset,0)!=0)  
{
printf("Khong di chuyen duoc con tro file toi do\n");  
getch();  
exit(1);  
}
fread(&nv,sizeof(nv),1,fp);  
printf("Ten :%s\n",nv.ten);  
printf("Ma nhan vien : %3d\n",nv.so);  
printf("Chieu cao :%4.2f\n",nv.cao);  
getch();  
}
§5. Lçi vµo ra  
Nãi chung , khi më tËp tin thµnh c«ng ta cã thÓ ghi lªn nã . Tuy nhiªn , nhiÒu tr−êng  
hîp kh«ng më ®−îc tËp tin nh−ng ta kh«ng biÕt lçi do ®©u . §Ó x¸c ®Þnh llâi ta dïng hµm  
38  
ferror() . Hµm nµy cã ®èi sè lµ con trá tËp tin . Hµm sÏ cã gi¸ trÞ kh«ng nÕu kh«ng cã lçi g× .  
Ng−îc l¹i hµm cho gi¸ trÞ kh¸c kh«ng . Ta còng cã thÓ dïng hµm perror() ®Ó chØ néi dung  
lçi .  
Ch−¬ng tr×nh 3-20 :  
#include <stdio.h>  
#include<conio.h>  
#include <string.h>  
#include <stdlib.h>  
void main()  
{
FILE *fp;  
char name[40],numstr[10];  
int code;  
float height;  
int n,i;  
clrscr();  
fp=fopen("a:\newfile.txt","w");  
printf("Cho so nguoi can nhap : ");  
gets(numstr);  
n=atoi(numstr);  
for (i=0;i<n;i++)  
{
printf("Nhap ten : ");  
gets(name);  
printf("Nhap ma so : ");  
gets(numstr);  
code=atoi(numstr);  
printf("Nhap chieu cao : ");  
gets(numstr);  
height=atof(numstr);  
fprintf(fp,"%s %d %f",name,code,height);  
if (ferror(fp))  
{
perror("Loi ghi file ");  
getch();  
exit(1);  
}
}
fclose(fp);  
}
Sau lçi do ta ghi , tr×nh biªn dÞch sÏ th«ng b¸o lçi cô thÓ trong c©u “ Loi ghi file : no  
such file á directory”  
§6. Vµo ra ë møc hÖ thèng  
1.C¸c tËp tin tiªu ®Ò vµ biÕn chuÈn : Trong c¸ch vµo ra ë møc hÖ thèng , ta ph¶i khëi t¹o  
bé ®Öm råi ®Æt d÷ liÖu vµo ®ã tr−íc ghi hay ®äc . Vµo ra ë møc hÖ thèng cã lîi ë chç l−îng  
m· Ýt h¬n vµo ra chuÈn vµ tèc ®é sÏ nhanh h¬n . §Ó dïng c¸c hµm cÊp 1 ta ph¶i cÇn c¸c tËp  
tin tiªu ®Ò sau :  
39  
io.h - chøa c¸c prototype cña c¸c hµm cÊp 1  
fcntl.h - chøa c¸c ®Þnh nghÜa quyÒn truy cËp  
sys/stat.h - ch¸ c¸c ®Þnh nghÜa thuéc tÝnh  
dã.h - chøa c¸c thuéc tÝnh theo DOS  
2. Tãm t¾t c¸c hµm :  
creat - t¹o tËp tin míi  
_creat - t¹o tËp tin míi theo kiÓu nhÞ ph©n  
open - më tËp tin  
_open - më tËp tin ®· tån t¹i  
close vµ _close - ®ãng tËp tin  
chmod - thay ®æi thuéc tÝnh cña tËp tin  
_chmode - thay ®æi thuéc tÝnh cña tËp tin theo kiÓu DOS  
perror - th«ng b¸o lçi (stdlib.h)  
write - ghi mét d·y c¸c byte  
read - ®äc mét d·y c¸c byte  
lseek - dïng di chuyÓn con trá vÞ trÝ  
3. §äc tËp tin theo c¸ch vµo ra hÖ thèng : Ta cã ch−¬ng tr×nh ®äc tËp tin tõ ®Üa vµ hiÓn thÞ  
lªn mµn h×nh theo c¸ch vµo ra hÖ thèng .  
Ch−¬ng tr×nh 3-21 :  
#include <conio.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <fcntl.h>  
#include <io.h>  
#define BUFFSIZE 512  
char buff[BUFFSIZE];  
void main(int argc,char *argv[])  
{
int inhandle,bytes,i;  
clrscr();  
if (argc!=2)  
{
printf("Dang <ten chuong trinh> <ten tap tin>");  
getch();  
exit(1);  
}
if ((inhandle=open(argv[1],O_RDONLY|O_BINARY))<0)  
{
printf("Khong mo duoc file\n");  
getch();  
exit(1);  
}
while ((bytes=read(inhandle,buff,BUFFSIZE))>0)  
for (i=0;i<bytes;i++)  
putch(buff[i]);  
close(inhandle);  
}
4. Khëi t¹o bé ®Öm : Trong ch−¬ng tr×nh ta ph¶i ®Þnh nghÜa bé ®Öm b»ng ph¸t biÓu  
#define BUFFSIZE 512  
char buff[BUFFSIZE]  
40  
Tải về để xem bản đầy đủ
pdf 24 trang Thùy Anh 15000 Free
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình C++ - Chương 3: Nhập và xuất dữ liệu", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_c_chuong_3_nhap_va_xuat_du_lieu.pdf