精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

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

驗證上例讀入的磁盤文件"stu_list"數據是否正確,將該盤文件讀入內存,并從熒屏上顯示。
#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);
}
}
程序運行時,屏幕將顯示出以下信息:
zhang 1001 17 room-101
fun 1002 18 room-102
tan 1003 19 room-103
ling 1004 20 room-104
正是上例存入的數據.
程序注釋:
原始數據以ASCII 形式輸入到內存時,回車換行符換成一個換行符。以"wb"方式從內存寫到文件"stu_list",以及再以"rb"方式將"stu_list"文件讀入內存,其間都不發生字符轉換。當用printf函數輸出到屏幕時以ASCII 形式輸出,換行符又轉換為回車加換行符。
格式化讀寫函數--fscanf( )函數和fprint( )函數
調用方式分別是: fscanf(文件指針,格式字符串,輸入表);
fscanf 函數將指針指向的文件內容,以格式符要求的形式,讀入內存指定地址內 fprintf(文件指針,格式字符串,輸出表);fprintf 函數是將內存指定地址內的內容,以格式符要求的形式,輸出到指針指向的文件
說明: 以上兩個函數與scanf( ) 和printf( )函數 只有一點不同:即前二者的讀寫對象是磁盤數據文件,即是文件指針指向的磁盤文件。 用fscanf( )和fprintf( )函數對磁盤文件 進行讀寫,使用方便,容易理解,但是,由于輸入是要將ASCII碼轉換為二進制形式,輸出時又要將二進制形式轉換成字符,花費時間較多。因此,在內存與磁盤頻繁交換數據的情況下,最好不用fscanf( )和fprintf( )函數,而用fread和fwrite函數。

例:編制一個程序,建立一個電話簿,包括姓名和電話號碼兩項內容,該程序有增加新姓名和電話號碼的功能,也可以根據姓名查詢已經存入電話簿的電話號碼。
程序在設計時將分別設計成三個函數:
1.菜單選項--menu( )
2.增加新電話號碼--add-num( )
3.查詢老電話號碼--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);
}
請運行程序,可以得到如下結果:
(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
讀入整型量函數--- getw( )函數和putw( )函數
調用方式如下例:
i=getw(fp);
它的作用是從磁盤文件讀一個整數到內存,賦給整型變量i。
putw(10,fp);
它的作用是將整數10輸出到fp指向的文件。
讀寫字符串函數-- fgets( )函數和fputs( )函數
調用方式分別為:
fgets(字符數組,n,fp);
fgets( )函數的作用是將fp指向的文件中
(n-1)個字符讀入字符數組,并且加結束符“\0”,若在(n-1) 個字符前遇到EOF或換行符,均結束讀入。
fputs(字符數組,fp);
fputs( )函數的作用是向指定的文件輸出一個字符串。如:
fputs(“china”,fp);
說明:
fgets( )和fputs( )函數與gets( )和puts( )函數的不同之處也在于:
前二者的讀寫對象為指定的文件。
 用戶自定義讀寫函數
如果用戶對于讀寫盤文件還有特殊的要求,或者是在某些C編譯的庫函數中,不包括前面所介紹的那些讀寫函數,用戶也可以自己定義函數。
比如:
定義getw函數
getw(fp)
FILE *fp;
{char *s; int i;
s=&i;
s[0]=getc(fp); s[1]=getc(fp);
return(i);
}
定義putw函數
putw(i,fp)
int i;
FILE *fp;
{char *s;
s=&i;
putc(s[0],fp);putc(s[1],fp);
return(i);
}
文件中有一個位置指針,指向當前的讀寫的位置。文件位置指針和指向文件的指針是兩個不同的概念,讀者必須要加以區分。位置指針隨讀寫的進行而移動,由移動方式確定了兩類讀寫:順序讀寫與隨機讀寫。如果位置指針按字節順序移動,就是順序讀寫。如果可以將位置指針按須要移動到任意位置,則可以實現隨機讀寫。位置指針的當前位置用相對于文件開頭的位移量表示。掌握當前位置指針情況,對讀寫的進行非常重要。
文件輸入輸出函數一覽表
分類                  函數名                 功能
打開文件        
                      fopen( )             打開文件。
關閉文件      
                      fclose( )             關閉文件。                          
                      exit( )                退出程序功能。
文件定位       
                     fseek( )              改變文件位置指針位置。
                     rewind( )            使文件位置指針重新置于文件開頭。
                     ftell( )                返回文件位置指針的當前值。
文件讀寫        
                     fgetc( ),getc( )   從指定文件取得一個字符。
                     fputc( ),putc( )   把字符輸出到指定文件。
                     fgets( )              從指定文件讀取字符串。
                     fputs( )              把字符串輸出到指定文件。
                     getw( )             從指定文件讀取一個字(int型)。
                     putw( )             把一個字(int型)輸出到指定文件。
                     fread( )             從指定文件中讀取數據項。
                     fwrite( )            把數據項寫到指定文件。
                     fscanf( )            從指定文件按格式輸入數據。
                     fprintf( )            按指定格式將數據寫到指定文件中。
文件狀態        
                     feof( )              若到文件末尾,函數值為“真”(非0)。
                     ferror( )         若對文件操作出錯,函數值為“真”(非0)。
                     clearerr( )       使ferror和feof函數值置零。
常見的文件讀、寫錯誤
1. 使用文件時忘記打開文件。用后又忘記關閉文件,造成文件的數據丟失。
2. 混淆文件指針與文件讀/寫的位置指針的概念。
3. 不明確當前位置指針的位置,造成讀/寫錯誤。
4. 不能使文件正確定位。
5. 文件的打開與使用方式不匹配。
例如,對文件以只讀方式打開,卻對文件進行讀寫,請看程序:
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”應改作“r+”。
 
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/snowwave123/archive/2008/04/23/2316649.aspx
本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
第十三章 文 件
C語言詳解——文件讀取
C語言文件操作之----文件的讀寫
【C語言】文件常用讀寫操作(含讀取學生信息示例)
C 的文件操作
C語言學習教程第十章-文件(4)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 长武县| 宜城市| 保定市| 高台县| 温泉县| 襄城县| 南岸区| 京山县| 合阳县| 杨浦区| 台东县| 宁陵县| 永仁县| 房产| 阿城市| 沅江市| 洛南县| 鄂伦春自治旗| 庆元县| 谷城县| 宜城市| 安吉县| 万年县| 宿州市| 张家川| 波密县| 锦屏县| 封丘县| 谢通门县| 阳东县| 天门市| 高淳县| 岑巩县| 永泰县| 赤水市| 昌邑市| 阿克| 祁阳县| 房山区| 岳阳市| 县级市|