C - 語言 文件相關:


一.生成隨機文件名:

// CFile.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"

int _tmain(int argc, _TCHAR* argv[])
{
	FILE *fpw;  //文件流指針,用於打開寫入文件
	char str[10];
	srand((unsigned)time(NULL));  //輔助通過srand函數產生僞隨機數

	for(int i = 0; i < 19; i++)
		str[i] = rand()%26+'a';  //產生隨機數
	
	strcat(str, ".ecg");
	fpw = fopen(str, "w+");
	printf("%s", str);
	getchar();

	return 0;
}

char rand_string(void)
{
	if(rand()%2)
		return rand()%26+'a';
	else
		return rand()%26+'A';
}




二.文件的操作:

1,兩種文件存取方式(輸入,輸出方式)
順序存取
直接存取


2,數據的兩種存放形式
文本文件
二進制文件


3,文件指針

    定義文件類型指針變量的一般形式:FILE *指針變量名;例如:FILE *fp1,*fp2;


4打開文件

在使用文件之前,需打開文件.在C裏使用fopen函數打開文件.格式爲:
fopen(文件名,文件使用方式);
此函數返回一個指向FILE類型的指針.如:
FILE *fp;
fp=fopen("file_1","r");
如果調用成功,fp就指向file_1,否則返回爲NULL,所以爲了保證文件的正確使用,要進行測試.採用如下語句:
If((fp=fopen("file_1","r"))==NULL)
{
printf("Cannot open this file\n");
exit(0);
}
最常用的文件使用方式及其含義如下:

1 “r”    爲讀而打開文本文件.(不存在則出錯)
2 “rb”   爲讀而打開二進制文件.
3 “w”    爲寫而打開文本文件.(若不存在則新建,反之,則從文件起始位置寫,原內容將被覆蓋)
4 “wb”   爲寫而打開二進制文件.
5 “a”    爲在文件後面添加數據而打開文本文件.(若不存在,則新建;反之,在原文件後追加)
6 “ab”   爲在文件後面添加數據而打開一個二進制文件.最常用的文件使用方式及其含義如下:
7 “r+”   爲讀和寫而打開文本文件.(讀時,從頭開始;在寫數據時,新數據只覆蓋所佔的空間,其後不變)
8 “rb+”  爲讀和寫而打開二進制文件.只是在隨後的讀寫時,可以由位置函數設置讀和寫的起始位置
9 “w+”   首先建立一個新文件,進行寫操作,隨後可以從頭開始讀.(若文件存在,原內容將全部消失)
10 “wb+” 功能與"w+"同.只是在隨後的讀寫時,可以由位置函數設置讀和寫的起始位置.最常用的文件使用方式及其含義如下:
11 “a+”  功能與"a"相同;只是在文件尾部添加新的數據後,可以從頭開始讀.
12 “ab+” 功能與"a+"相同;只是在文件尾部添加新數據之後,可以由位置函數設置開始讀的起始位置.
13 “rt” 只讀打開一個文本文件,只允許讀數據,
14 “wt” 只寫打開或建立一個文本文件,只允許寫數據
15 “at”  追加打開一個文本文件,並在文件末尾寫數據
16 “rb”  只讀打開一個二進制文件,只允許讀數據
17 “wb”  只寫打開或建立一個二進制文件,只允許寫數據
18 “ab”  追加打開一個二進制文件,並在文件末尾寫數據
19 “rt+” 讀寫打開一個文本文件,允許讀和寫。用fseek確定讀寫位置,寫多少覆蓋多少,後面的內容保留。因爲磁盤空間是連續的,所以你不能在中間插入,在中間一旦寫	 入就是覆蓋與寫入內容等長的那些內容。
20 “wt+” 讀寫打開或建立一個文本文件,允許讀寫
21 “at+” 讀寫打開一個文本文件,允許讀,或在文件末追加數據
22 “rb+” 讀寫打開一個二進制文件,允許讀和寫
23 “wb+” 讀寫打開或建立一個二進制文件,允許讀和寫
24 “ab+” 讀寫打開一個二進制文件,允許讀,或在文件末追加數據


5關閉文件
當文件的讀寫操作完成之後,使用fclose函數關閉文件.格式如下:
fclose(文件指針)
:fclose(fp);
調用getc(fgetc)putc(fputc)函數進行輸入和輸出
1,調用putc(fputc)函數輸出一個字符
調用形式爲:
putc(ch,fp);
功能是:將字符ch寫到文件指針fp所指的文件中去.當輸出成功,putc函數返回所輸出的字符;否則,返回一個EOF.EOF是在stdio.h
函數文件中定義的符號常量,其值等於-1.


6.調用getc(fgetc)putc(fputc)函數進行輸入和輸出
例如:把從鍵盤輸入的文本按原樣輸出到名爲file_1.dat文件中,用字符@作爲鍵盤輸入結束標誌.

#include
Void main()
{
FILE *fpout;
char ch;
if(fpout=fpopen("file_1","w")==NULL)
{
printf("Cannot open this file!\n");
exit(0);
}
ch=getchar();
while(ch!='@')
{ fputc(ch,fpout); ch=getchar(); }
fclose(fpout);
}
/*
調用getc(或fgetc)函數輸入一個字符
調用形式爲:
ch=getc(pf);
功能是:從pf指定的文件中讀如一個字符,並把它作爲函數值返回.
例如:把一個已存在磁盤上的file_1.dat文本文件中的內容,原樣輸出到終端屏幕上.*/
#include
void main(){
FILE *fpin;
char ch;
if((fpin=fopen("file_1.dat","r"))==NULL)
{ printf("Cann't open this file!\n");exit(0);}
ch=fgetc(fpin);
while (ch!=EOF)
{ putchar(ch); ch=fgetc(fpin);}
fclose(fpin);
}

7判斷文件結束函數feof

EOF可以作爲文本文件的結束標誌,但不能作爲二進制文件的結束符.feof函數既可以判斷二進制文件,又可以判斷文本文件.
:編寫程序,用於把一個文本文件()複製到另一個文件(目的),源文件名和目的文件名由命令行輸入.命令形式如下:
可執行程序名 源文件名 目的文件名

#include
void filecopy(FILE* ,FILE *);
void main(int argc,char *argv[]){
FILE *fpin,*fpout;
if(argc==3)
{ fpin=fopen(argv[1],"r");
fpout=fopen(argv[2],"w");
filecopy(fpin,fpout);
fclose(fpin);fclose(fpout);
}
else if(argc>3)
printf("The file names too many!!\n";
else
printf("There are no file names for input or output!!\n );
}
void filecopy(FILE *fpin,FILE *fpout)
{
char ch;
ch=getc(fpin);
while(!feof(fpin))
{putc(ch,fpout); ch=getc(fpin);}
}

8.fscanf函數和fprintf函數

1,fscanf函數
fscanf只能從文本文件中按格式輸入,scanf函數相似,只不過輸入的對象是磁盤上文本文件中的數據.調用形式爲:
fscanf(文件指針,格式控制字符串,輸入項表)
例如:fscanf(fp,"%d%d",&a,&b);
fscanf(stdin,"%d%d",&a,&b);
等價於scanf("%d%d",&a,&b);
3.fprintf函數
fprintf函數按格式將內存中的數據轉換成對應的字符,並以ASCII代碼形式輸出到文本文件中.Fprintf函數和printf函數相似,只是
將輸出的內容按格式存放到磁盤的文本文件中.調用形式如下:
fprintf(文件指針,格式控制字符串,輸出項表)
:fprintf(fp,"%d %d",x,y);
以下語句 fprintf(stdout,"%d %d",x,y)


9.fgets函數和fputs函數

2,fputs函數
fput函數把字符串輸出到文件中.函數調用形式如下:
fputs(str,fp);
注意:爲了便於讀入,在輸出字符串時,應當人爲的加諸如"\n"這樣的字符串.


10.fread函數和fwrite函數
fread and fwrite函數用來讀,寫二進制文件.它們的調用形式如下:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer:要輸入或輸出的數據塊的首地址
count:每讀寫一次,輸入或輸出數據塊的個數
size:每個數據塊的字節數
fp:文件指針


11.fread函數和fwrite函數
例如有如下結構體:
struct st{
char num[8];
float mk[5];
}pers[30];
以下循環將把這30個元素中的數據輸出到fp所指文件中.
for(i=0;i}


12.文件定位函數
1,fseek函數
fseek函數用來移動文件位置指針到指定的位置上,接着的讀或寫操作將從此位置開始.函數的調用形式如下:
fseek(pf,offset,origin)
pf:文件指針
offset:以字節爲單位的位移量,爲長整形.
origin:是起始點,用來指定位移量是以哪個位置爲基準的.
1,fseek函數
位移量的表示方法
標識符 數字 代表的起始點
SEEK_SET 0 文件開始
SEEK_END 2 文件末尾
SEEK_CUR 1 文件當前位置
假設pf已指向一個二進制文件,;
fseek(pf,30L,SEEK_SET)
fseek(pf,-10L*sizeof(int),SEEK_END)
對於文本文件,位移量必須是0;:
fseek(pf,0L,SEEK_SET)
fseek(pf,0L,SEEK_END)
2. ftell函數
ftell函數用以獲得文件當前位置指針的位置,函數給出當前位置指針相對於文件開頭的字節數.;
long t;
t=ftell(pf);
當函數調用出錯時,函數返回-1L.
我們可以通過以下方式來測試一個文件的長度:
fseek(fp,0L,SEEK_END);
t=ftell(fp);
3.rewind函數
調用形式爲:
rewind(pf);
函數沒有返回值.函數的功能是使文件的位置指針回到文件的開頭.





發佈了80 篇原創文章 · 獲贊 13 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章