檔案的讀寫

Keegan-揚發表於2019-04-04

在這裡插入圖片描述

/*將0-127之間的ASCII字元寫到檔案中,
然後從檔案中讀出並顯示到螢幕上*/ 
#include<stdio.h>
#include<stdlib.h>
main()
{	FILE *fp;
	char ch;
	int i;
	if((fp=fopen("奇異博士.doc","wb"))==NULL)/*以二進位制寫的方式開啟檔案*/
	{	printf("File open 奇異博士.doc error !\n");
		exit(0);//表示終止程式執行 。包含在<stdlib.h> 
	} 
	for(i=0;i<128;i++)
	{	fputc(i,fp);/*將ASCII值在0-127之間的所有字元寫入檔案*/
	} 
	fclose(fp);
	if((fp=fopen("奇異博士.doc","rb"))==NULL)/*以二進位制讀的方式開啟檔案*/
	{	printf("File open 奇異博士.doc error !\n");
		exit(0);//表示終止程式執行 。包含在<stdlib.h> 
	}
	while((ch=fgetc(fp))!=EOF)/*從檔案中讀取字元直到檔案末尾*/
	{	putchar(ch);/*在顯示器上顯示從檔案讀出的所有字元*/
	}
	fclose(fp);
}

執行結果:
在這裡插入圖片描述
將上述結果比較奇異博士.doc 裡的檔案的內容:
在這裡插入圖片描述
在這裡插入圖片描述
為什麼在螢幕上顯示的字元與奇異博士.doc 文件裡看到的內容不一致?
在這裡插入圖片描述
21-23行通過檢查fgetc()的返回值是否為EOF來判斷是否讀到了檔案末尾,若讀到了檔案的末尾,則返回EOF,即-1.
除此之外,還可以使用函式feof()來判斷是否讀到檔案末尾。因此,將21-23行
做如下修改:
在這裡插入圖片描述

ch=fgetc(fp);
	while(!feof(fp))
	{	putchar(ch);
		ch=fgetc(fp);
	 } 

函式feof()用於是否到達檔案末尾。當檔案位置指標指向檔案結束符時(EOF,全稱End-of-file Indicator),返回非0值,否則返回0。

修改上述程式,將ASCII值在0-127之間的字元寫到磁碟檔案上,然後從檔案中讀取這些字元時,判斷讀出的字元是否為可列印字元,若是則直接將字元顯示到螢幕上,否則將該字元的十進位制ASCII值相識到螢幕上。
在這裡插入圖片描述

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h> 
main()
{	FILE *fp;
	char ch;
	int i;
	if((fp=fopen("奇異博士.doc","wb"))==NULL)/*以二進位制寫的方式開啟檔案*/
	{	printf("File open 奇異博士.doc error !\n");
		exit(0);//表示終止程式執行 。包含在<stdlib.h> 
	} 
	for(i=0;i<128;i++)
	{	fputc(i,fp);/*將ASCII值在0-127之間的所有字元寫入檔案*/
	} 
	fclose(fp);
	if((fp=fopen("奇異博士.doc","rb"))==NULL)/*以二進位制讀的方式開啟檔案*/
	{	printf("File open 奇異博士.doc error !\n");
		exit(0);//表示終止程式執行 。包含在<stdlib.h> 
	}
	while((ch=fgetc(fp))!=EOF)/*從檔案中讀取字元直到檔案末尾*/
	{	if(isprint(ch))/*包含在<ctype.h>。 判斷是否是可列印字元*/
			printf("%c\t",ch);/*若是可列印字元,則顯示該字元*/
		else
			printf("%d\t",ch);/*若非可列印字元,則顯示該字元的ASCII值*/ 
	 } 
	fclose(fp);
}

讀寫檔案中的字串
從檔案中讀取字串可以用函式fgets()

用函式fgets()來改寫上述案例。從鍵盤輸入一串字元,然後把它們新增到文字檔案“美國隊長.doc”的末尾。假設文字檔案美國隊長.doc中已有內容為:我是美隊。

文字檔案美國隊長.doc中已有內容為:我是美隊的程式碼如下:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h> 
#define N 80 
main()
{	FILE *fp;
	char str[N];
	if((fp=fopen("美國隊長.doc","w"))==NULL)/*判斷檔案是否成功開啟*/
	{	printf("File open 美國隊長.doc error !\n");
		exit(0);//表示終止程式執行 。包含在<stdlib.h> 
	} 
	gets(str); /*從鍵盤讀入一個字串*/
	fputs(str,fp);/*將字串str寫入fp所指的檔案中*/
	fclose(fp);
	if((fp=fopen("美國隊長.doc","r"))==NULL)/*以讀的方式開啟檔案*/
	{	printf("File open 美國隊長.doc error !\n");
		exit(0);//表示終止程式執行 。包含在<stdlib.h> 
	}
	fgets(str,N,fp);/*從fp所指的檔案中讀出字串,最多讀N-1個字元*/
	puts(str); /*將字串顯示在螢幕上*/
	fclose(fp);
}

在這裡插入圖片描述
接下來演示對 美國隊長.doc 的內容進行追加:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
每執行一次程式,美國隊長.doc 的內容都會追加。為什麼?
在這裡插入圖片描述
因為第十行是以新增的方式開啟 美國隊長.doc 的。因此,每次執行程式時從鍵盤輸入的字串都會被新增到 美國隊長.doc 的末尾。

看看第二次新增的現象:
在這裡插入圖片描述
怎麼樣?是不是在第一次內容的基礎上又新增了一次內容?說明上述分析的邏輯是正確的。
在這裡插入圖片描述

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h> 
#define N 80 
main()
{	FILE *fp;
	char str[N];
	if((fp=fopen("美國隊長.doc","a"))==NULL)/*以新增的方式開啟文字檔案*/
	{	printf("File open 美國隊長.doc error !\n");
		exit(0);//表示終止程式執行 。包含在<stdlib.h> 
	} 
	gets(str); /*從鍵盤讀入一個字串*/
	fputs(str,fp);/*將字串str寫入fp所指的檔案中*/
	fclose(fp);
	if((fp=fopen("美國隊長.doc","r"))==NULL)/*以讀的方式開啟檔案*/
	{	printf("File open 美國隊長.doc error !\n");
		exit(0);//表示終止程式執行 。包含在<stdlib.h> 
	}
	fgets(str,N,fp);/*從fp所指的檔案中讀出字串,最多讀N-1個字元*/
	puts(str); /*將字串顯示在螢幕上*/
	fclose(fp);
}