国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
c語(yǔ)言中文件的操作
C語(yǔ)言中文件的操作(上)
C語(yǔ)言的文件以字節(jié)為單位,即以字節(jié)為單位進(jìn)行讀寫(xiě)。
C的文件類型分為兩類:ASCII文件和二進(jìn)制文件,ASCII文件又稱為文本件。二進(jìn)制文件則稱為非文本文件。
例如:數(shù)據(jù)10000的表示形式分別如下。
在內(nèi)存中存儲(chǔ)形式:
00100111   00010000
在磁盤中的存儲(chǔ)形式:
ASCII形式(文本文件):
00110001  00110000  00110000  00110000
    (1)             (0)            (0)           (0)
 
二進(jìn)制格式(非文本文件)
00100111 00010000

緩沖文件系統(tǒng)
  緩沖文件系統(tǒng)是指:系統(tǒng)在內(nèi)存區(qū)自動(dòng)為每一個(gè)正在使用的文件開(kāi)辟一個(gè)緩沖區(qū),它的大小由C的版本確定,一般為512Byte。內(nèi)存與磁盤空間的數(shù)據(jù)交換都必須經(jīng)過(guò)緩沖區(qū),而且必須充滿緩沖區(qū)(文件結(jié)束時(shí)可以不要求)。
非緩沖區(qū)文件系統(tǒng)
 非緩沖區(qū)文件系統(tǒng):系統(tǒng)不自動(dòng)開(kāi)辟緩沖區(qū)的大小,而由程序?yàn)槊恳粋€(gè)文件設(shè)訂緩沖區(qū)。這種處理方式為早期的C語(yǔ)言采用。
打開(kāi)文件函數(shù)-- fopen( )函數(shù)的調(diào)用方式:
FILE *fp;
fp=fopen(文件名,使用文件方式);
該函數(shù)執(zhí)行后將打開(kāi)一個(gè)文件。參數(shù)中文件名即是要打開(kāi)的文件的名稱,使用文件的方式即是讀寫(xiě)的方式,使用方式下表,fp則是指向正要打開(kāi)的文件。fopen函數(shù)帶回指向文件的指針賦給fp,這樣fp和文件相連系了。
 
文件使用方式                         含義                                   
   “r” (只讀)              為輸入打開(kāi)一個(gè)文本文件
   “w” (只寫(xiě))            為輸出打開(kāi)一個(gè)文本文件  
   “a” (追加)              向文本文件尾增加數(shù)據(jù)
   “rb” (只讀)            為輸入打開(kāi)一個(gè)二進(jìn)制文件
   “wb” (只寫(xiě))           為輸出打開(kāi)一個(gè)二進(jìn)制文件
   “ab” (追加)            向二進(jìn)制文件尾增加數(shù)據(jù)
    “r+” (讀寫(xiě))           為讀/寫(xiě)打開(kāi)一個(gè)文本文件
    “w+” (讀寫(xiě))         為讀/寫(xiě)建立一個(gè)新的文本文件
    “a+” (讀寫(xiě))          為讀/寫(xiě)打開(kāi)一個(gè)文本文件
    “rb+” (讀寫(xiě))         為讀/寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件
    “wb+” (讀寫(xiě))        為讀/寫(xiě)建立一個(gè)新的二進(jìn)制文件
    “ab+” (讀寫(xiě))         為讀/寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件
說(shuō)明:
(1) 用r(只讀)方式打開(kāi)文件只能用于程序從文件輸入數(shù)據(jù),不能向文件輸出數(shù)據(jù),而且要求該文件已經(jīng)存在,否則函數(shù)fopen()將返回空指針NULL。
(2) 用w(只寫(xiě))方式打開(kāi)的文件只能用于向文件輸出數(shù)據(jù),不能從該文件中輸入數(shù)據(jù),如果打開(kāi)時(shí)原文件不存在,則新建該文件,如果原文件已經(jīng)存在,則刪除原文件里的數(shù)據(jù)。
(3)用a(追加)方式打開(kāi)的文件,表示不刪除原文件里的數(shù)據(jù),而是從文件的末尾開(kāi)始填加數(shù)據(jù),要求被打開(kāi)的文件已經(jīng)存在,打開(kāi)后,文件的位置指針將定位在文件的末尾,如果打開(kāi)的文件已經(jīng)存在,則函數(shù)fopen()返回一個(gè)空指針。
(4)用r+, w+,a+(讀/寫(xiě))方式打開(kāi)的文件,既可以從文件輸入數(shù)據(jù),也可以向文件輸出數(shù)據(jù),其中r+只允許打開(kāi)已存在的文件,用w+方式打開(kāi),則系統(tǒng)新建一個(gè)文件,先向文件輸出數(shù)據(jù),然后才能從文件中輸入數(shù)據(jù)。用a+方式是打開(kāi)已經(jīng)存在的文件,并且文件的位置指針定位在文件的末尾,先準(zhǔn)備向文件添加數(shù)據(jù),以后也可以從文件中輸入數(shù)據(jù)。
(5)上述打開(kāi)的文件都是針對(duì)文本文件,如果要打開(kāi)二進(jìn)制文件,必須在使用方式后面添上字符b,如rb表示以只讀方式打開(kāi)一個(gè)二進(jìn)制文件。
使用打開(kāi)函數(shù)時(shí)需要注意以下幾點(diǎn):
1.讀寫(xiě)文件函數(shù)的使用與文件的打開(kāi)方式必須相匹配。
2.用文本文件的計(jì)算機(jī)輸入時(shí),將回車換行符轉(zhuǎn)為一個(gè)換行符,在輸出時(shí)把換行符按原樣轉(zhuǎn)換回去。
3.在程序運(yùn)行時(shí),系統(tǒng)自動(dòng)打開(kāi)三個(gè)標(biāo)準(zhǔn)文件:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)出錯(cuò)輸出。
關(guān)閉文件函數(shù)-- fclose( )函數(shù)的調(diào)用方式:
FILE *fp;
fclose(fp);
fclose()的作用是使文件指針變量撤消原先調(diào)用fopen()函數(shù)時(shí)所建立的它與文件的聯(lián)系。
C語(yǔ)言中文件的操作(下)
文件的讀寫(xiě)
文件被打開(kāi)后,立即可以執(zhí)行讀寫(xiě)操作.在下面的函數(shù)中所應(yīng)用的fp是指文件指針變量,它從fopen( )函數(shù)得到返回值,在下面使用fp之處,不再另加說(shuō)明.
測(cè)試文件尾函數(shù)--feof( )函數(shù)
調(diào)用方式: feof(fp) 該函數(shù)用來(lái)測(cè)試fp所指向的文件的當(dāng)前狀態(tài): 文件結(jié)束,函數(shù)值為1 否則值為0
讀寫(xiě)一個(gè)字符函數(shù)--函數(shù)fgetc()和fputc()
調(diào)用形式分別為: ch=fgetc(fp); fputc(ch,fp); fgetc()函數(shù)將fp指向的文件的一個(gè)字符讀到內(nèi)存,賦給字符變量ch.如果遇文件結(jié)束符時(shí),函數(shù)返回值為1. 為便于書(shū)寫(xiě),在stdio.h中將fgetc()和fputc()定義宏名為getc()和putc():
#define getc(fp) fgetc(fp)
#define putc(ch,fp) fputc(ch,fp)
例:從鍵盤輸入一些字符逐個(gè)送入磁盤,直到#為止。再將此盤文件讀入內(nèi)存,逐個(gè)顯示在光屏。
# include "stdio.h"
main( )
{FILE *fp;
char ch,filename[10];
scanf("%s",filename); /*讀入磁盤文件名*/
if((fp=fopen(filename,"w"))==NULL) /*建立新文件 */
{ printf("cannot open file\n"); /*建立新文件出錯(cuò)誤信息*/
exit(1); /*終止調(diào)用過(guò)程、關(guān)閉所有文件*/
}
ch=getchar( ); /*從鍵盤讀入一個(gè)字符*/
while(ch!='#') /*讀到#時(shí)停止輸入*/
{ fputc(ch,fp); /*將ch內(nèi)字符寫(xiě)入fp指向的文件*/
ch=getchar( );
}
close(fp); /*關(guān)閉fp所指向的文件*/
if((fp=fopen(filename,"r"))==NULL) /*將filename 以'r'方式打開(kāi)*/
{printf("cannot open file\n");
exit (1);
}
ch=fgetc(fp); /*從fp指向的文件讀一個(gè)字符給ch變量 */
while(ch!=EOF) /*讀到文件結(jié)束符EOF時(shí)結(jié)束 */
{putchar(ch);
ch=fgetc(fp);
}
fclose(fp); /*關(guān)閉文件*/
}
請(qǐng)你運(yùn)行程序,按如下的輸入,可以得到如下的結(jié)果:
file.c basic、fortran and c
computer #
basic、fortran and c
computer
用DOS命令TYPE檢查file.c的內(nèi)容:
C:>TYPE file.c
basic、fortran and c
computer
讀寫(xiě)數(shù)據(jù)塊函數(shù)--fread( )和fwrite( )函數(shù)
調(diào)用方式分別為: fread(buffer,size,count,fp);
該函數(shù)將fp指向的文件的數(shù)據(jù)以數(shù)據(jù)塊的形式讀入內(nèi)存buffer。
fwrite(buffer,size,count,fp);
該函數(shù)將內(nèi)存buffer的內(nèi)容以數(shù)據(jù)塊的形式寫(xiě)入fp指向的文件。 其中: buffer:是一個(gè)指針。對(duì)于fread來(lái)說(shuō) 它是讀入數(shù)據(jù)的有效地址。對(duì) fwrite來(lái)說(shuō),是要寫(xiě)盤的數(shù)據(jù)地址(起始地址)。 size:要讀寫(xiě)的字節(jié)數(shù)。 count:要進(jìn)行讀寫(xiě)多少個(gè)size字節(jié)的 數(shù)據(jù)項(xiàng)。 fp:文件型指針 如果fread或fwrite調(diào)用成功,則函數(shù)返回值為count的值。 若文件以二進(jìn)制形式打開(kāi),用fread和fwrite函數(shù)就可以讀寫(xiě)任何類型的信息。如: fread(f,4,2,fp); f為實(shí)型數(shù)組名,4表示個(gè)實(shí)型變量占4個(gè)字節(jié),2表示讀入2次,fp向的文件數(shù)據(jù).
例:從鍵盤輸入4個(gè)學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤文件上去。
#include"stdio.h"
#define SIZE 4
struct student_type
{char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
void save() /*save( )函數(shù),將數(shù)據(jù)送到"stu_list"磁盤文件中去。*/
{FILE *fp;
int i;
if((fp=fopen("stu_list","wb"))==NULL)
{printf("cannot open file\n");
return;
}
for(i=0;i<SIZE;i++)
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
/*函數(shù)sizeof 計(jì)算一個(gè)結(jié)構(gòu)體student_type的變量長(zhǎng)度29(10+2+2+15)字節(jié)*/
printf("file write error\n");
}
main() /*在主函數(shù)main( )中的終端讀入4個(gè)學(xué)生的數(shù)據(jù),然后調(diào)用save( )函數(shù)。*/
{int i;
for(i=0;i<SIZE;i++)
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age, stud[i].addr);
save();
}
運(yùn)行情況如下。
輸入4個(gè)學(xué)生的姓名、學(xué)號(hào)、年齡和地址:
zhang 1001 17 room-101
fun 1002 18 room-102
tan 1003 19 room-103
ling 1004 20 room-104
好了,數(shù)據(jù)已經(jīng)存入文件中了.如何驗(yàn)證呢?請(qǐng)看例:

驗(yàn)證上例讀入的磁盤文件"stu_list"數(shù)據(jù)是否正確,將該盤文件讀入內(nèi)存,并從熒屏上顯示。
#include"stdio.h"
#define SIZE 4
struct student_type
{char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
main( )
{int i;
FILE *fp;
fp=fopen("stu_list","rb");
for(i=0;i<SIZE;i++)
{fread(&stud[i],sizeof(struct student_type),1,fp);
printf("%-10s%4d%4d%-l5s\n",stud[i].name, stud[i].num,stud[i].age,stud[i].addr);
}
}
程序運(yùn)行時(shí),屏幕將顯示出以下信息:
zhang 1001 17 room-101
fun 1002 18 room-102
tan 1003 19 room-103
ling 1004 20 room-104
正是上例存入的數(shù)據(jù).
程序注釋:
原始數(shù)據(jù)以ASCII 形式輸入到內(nèi)存時(shí),回車換行符換成一個(gè)換行符。以"wb"方式從內(nèi)存寫(xiě)到文件"stu_list",以及再以"rb"方式將"stu_list"文件讀入內(nèi)存,其間都不發(fā)生字符轉(zhuǎn)換。當(dāng)用printf函數(shù)輸出到屏幕時(shí)以ASCII 形式輸出,換行符又轉(zhuǎn)換為回車加換行符。
格式化讀寫(xiě)函數(shù)--fscanf( )函數(shù)和fprint( )函數(shù)
調(diào)用方式分別是: fscanf(文件指針,格式字符串,輸入表);
fscanf 函數(shù)將指針指向的文件內(nèi)容,以格式符要求的形式,讀入內(nèi)存指定地址內(nèi) fprintf(文件指針,格式字符串,輸出表);fprintf 函數(shù)是將內(nèi)存指定地址內(nèi)的內(nèi)容,以格式符要求的形式,輸出到指針指向的文件
說(shuō)明: 以上兩個(gè)函數(shù)與scanf( ) 和printf( )函數(shù) 只有一點(diǎn)不同:即前二者的讀寫(xiě)對(duì)象是磁盤數(shù)據(jù)文件,即是文件指針指向的磁盤文件。 用fscanf( )和fprintf( )函數(shù)對(duì)磁盤文件 進(jìn)行讀寫(xiě),使用方便,容易理解,但是,由于輸入是要將ASCII碼轉(zhuǎn)換為二進(jìn)制形式,輸出時(shí)又要將二進(jìn)制形式轉(zhuǎn)換成字符,花費(fèi)時(shí)間較多。因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好不用fscanf( )和fprintf( )函數(shù),而用fread和fwrite函數(shù)。

例:編制一個(gè)程序,建立一個(gè)電話簿,包括姓名和電話號(hào)碼兩項(xiàng)內(nèi)容,該程序有增加新姓名和電話號(hào)碼的功能,也可以根據(jù)姓名查詢已經(jīng)存入電話簿的電話號(hào)碼。
程序在設(shè)計(jì)時(shí)將分別設(shè)計(jì)成三個(gè)函數(shù):
1.菜單選項(xiàng)--menu( )
2.增加新電話號(hào)碼--add-num( )
3.查詢老電話號(hào)碼--lookup( )。
程序如下:
#include "stdio.h"
void add_num( ),lookup( );
main( )
{ char choice;
do{choice=menu( );
switch(choice)
{ case 'A':add_num( ); break;
case 'L':lookup( ); break; }
}while(choice!='Q');
}
menu( )
{ char ch;
do{
printf("(A)dd,(L)ookup or (Q)uit:");
ch=tolower(getche( ));
printf("\n"); }
while(ch!='Q'&&ch!='A'&&ch!='L');
return ch;
}
void add_num( )
{ FILE * fp;
char name[80];
int a_code,exchg,num;
if((fp=fopen("phone","a"))==NULL)
{ printf("cannot open directory file\n"); exit(1); }
printf("enter name and number:");
fscanf(stdin,"%s%d%d%d",name,&a_code,&exchg,&num);
fscanf(stdin,"%*c");
fprintf(fp,"%s %d %d %d n",name,a_code,exchg,num);
fclose(fp);
}
void lookup( )
{ FILE *fp;
char name[80],name2[80];
int a_code,exchg,num;
if((fp=fopen("phone","r"))==NULL)
{ printf("cannot open directory file\n"); exit(1); }
printf("name?");
gets(name);
while(!feof(fp))
{fscanf(fp,"%s%d%d%d",name2,&a_code,&exchg,&num);
if(!strcmp(name,name2))
{printf("%s: (%d)%d-%d\n",name,a_code,exchg,num); break; }
}
fclose(fp);
}
請(qǐng)運(yùn)行程序,可以得到如下結(jié)果:
(A)dd,(L)ookup or (Q)uit:A Enter name and number: Liming 6789 1234 135
(A)dd,(L)ookup or (Q)uit:A Enter name and number: Lihung 5678 235 357
(A)dd,(L)ookup or (Q)uit:L name?Liming Liming:(6789)1234-135
(A)dd,(L)ookup or (Q)uit:Q
讀入整型量函數(shù)--- getw( )函數(shù)和putw( )函數(shù)
調(diào)用方式如下例:
i=getw(fp);
它的作用是從磁盤文件讀一個(gè)整數(shù)到內(nèi)存,賦給整型變量i。
putw(10,fp);
它的作用是將整數(shù)10輸出到fp指向的文件。
讀寫(xiě)字符串函數(shù)-- fgets( )函數(shù)和fputs( )函數(shù)
調(diào)用方式分別為:
fgets(字符數(shù)組,n,fp);
fgets( )函數(shù)的作用是將fp指向的文件中
(n-1)個(gè)字符讀入字符數(shù)組,并且加結(jié)束符“\0”,若在(n-1) 個(gè)字符前遇到EOF或換行符,均結(jié)束讀入。
fputs(字符數(shù)組,fp);
fputs( )函數(shù)的作用是向指定的文件輸出一個(gè)字符串。如:
fputs(“china”,fp);
說(shuō)明:
fgets( )和fputs( )函數(shù)與gets( )和puts( )函數(shù)的不同之處也在于:
前二者的讀寫(xiě)對(duì)象為指定的文件。
 用戶自定義讀寫(xiě)函數(shù)
如果用戶對(duì)于讀寫(xiě)盤文件還有特殊的要求,或者是在某些C編譯的庫(kù)函數(shù)中,不包括前面所介紹的那些讀寫(xiě)函數(shù),用戶也可以自己定義函數(shù)。
比如:
定義getw函數(shù)
getw(fp)
FILE *fp;
{char *s; int i;
s=&i;
s[0]=getc(fp); s[1]=getc(fp);
return(i);
}
定義putw函數(shù)
putw(i,fp)
int i;
FILE *fp;
{char *s;
s=&i;
putc(s[0],fp);putc(s[1],fp);
return(i);
}
文件中有一個(gè)位置指針,指向當(dāng)前的讀寫(xiě)的位置。文件位置指針和指向文件的指針是兩個(gè)不同的概念,讀者必須要加以區(qū)分。位置指針隨讀寫(xiě)的進(jìn)行而移動(dòng),由移動(dòng)方式確定了兩類讀寫(xiě):順序讀寫(xiě)與隨機(jī)讀寫(xiě)。如果位置指針按字節(jié)順序移動(dòng),就是順序讀寫(xiě)。如果可以將位置指針按須要移動(dòng)到任意位置,則可以實(shí)現(xiàn)隨機(jī)讀寫(xiě)。位置指針的當(dāng)前位置用相對(duì)于文件開(kāi)頭的位移量表示。掌握當(dāng)前位置指針情況,對(duì)讀寫(xiě)的進(jìn)行非常重要。
文件輸入輸出函數(shù)一覽表
分類                  函數(shù)名                 功能
打開(kāi)文件        
                      fopen( )             打開(kāi)文件。
關(guān)閉文件      
                      fclose( )             關(guān)閉文件。                          
                      exit( )                退出程序功能。
文件定位       
                     fseek( )              改變文件位置指針位置。
                     rewind( )            使文件位置指針重新置于文件開(kāi)頭。
                     ftell( )                返回文件位置指針的當(dāng)前值。
文件讀寫(xiě)        
                     fgetc( ),getc( )   從指定文件取得一個(gè)字符。
                     fputc( ),putc( )   把字符輸出到指定文件。
                     fgets( )              從指定文件讀取字符串。
                     fputs( )              把字符串輸出到指定文件。
                     getw( )             從指定文件讀取一個(gè)字(int型)。
                     putw( )             把一個(gè)字(int型)輸出到指定文件。
                     fread( )             從指定文件中讀取數(shù)據(jù)項(xiàng)。
                     fwrite( )            把數(shù)據(jù)項(xiàng)寫(xiě)到指定文件。
                     fscanf( )            從指定文件按格式輸入數(shù)據(jù)。
                     fprintf( )            按指定格式將數(shù)據(jù)寫(xiě)到指定文件中。
文件狀態(tài)        
                     feof( )              若到文件末尾,函數(shù)值為“真”(非0)。
                     ferror( )         若對(duì)文件操作出錯(cuò),函數(shù)值為“真”(非0)。
                     clearerr( )       使ferror和feof函數(shù)值置零。
常見(jiàn)的文件讀、寫(xiě)錯(cuò)誤
1. 使用文件時(shí)忘記打開(kāi)文件。用后又忘記關(guān)閉文件,造成文件的數(shù)據(jù)丟失。
2. 混淆文件指針與文件讀/寫(xiě)的位置指針的概念。
3. 不明確當(dāng)前位置指針的位置,造成讀/寫(xiě)錯(cuò)誤。
4. 不能使文件正確定位。
5. 文件的打開(kāi)與使用方式不匹配。
例如,對(duì)文件以只讀方式打開(kāi),卻對(duì)文件進(jìn)行讀寫(xiě),請(qǐng)看程序:
if((fp=fopen(“test”,“r”))==NULL)
{printf(“cannot open this file\n”);
exit(1);
}
ch=fget(fp);
while(ch!=‘#’)
{ch=ch+4;
fputc(ch,fp);
ch=fget(fp);
}
以上程序段的“r”應(yīng)改作“r+”。
 
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/snowwave123/archive/2008/04/23/2316649.aspx
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
第十三章 文 件
C語(yǔ)言詳解——文件讀取
C語(yǔ)言文件操作之----文件的讀寫(xiě)
【C語(yǔ)言】文件常用讀寫(xiě)操作(含讀取學(xué)生信息示例)
C 的文件操作
C語(yǔ)言學(xué)習(xí)教程第十章-文件(4)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服