c語言里面的各種字符/字符串讀寫一直搞得我分不清楚。。今天來學習總結一下:
原文章來自http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html
http://sodino.com/2015/03/07/c-file-io/
打開(讀寫)文件
1.函數原型
FILE *fopen(char *pname,char *mode)
2.功能說明
按照mode 規定的方式,打開由pname指定的文件。若找不到由pname指定的相應文件,就按以下方式之一處理:
(1) 此時如mode 規定按寫方式打開文件,就按由pname指定的名字建立一個新文件;
(2) 此時如mode 規定按讀方式打開文件,就會產生一個錯誤。
打開文件的作用是:
(1)分配給打開文件一個FILE 類型的文件結構體變量,并將有關信息填入文件結構體變量;
(2)開辟一個緩沖區;
(3)調用操作系統提供的打開文件或建立新文件功能,打開或建立指定文件;
FILE *:指出fopen是一個返回文件類型的指針函數;
3.參數說明
pname:是一個字符指針,它將指向要打開或建立的文件的文件名字符串。
mode:是一個指向文件處理方式字符串的字符指針,指出打開的方式:
補充:
t:text文本文件
b:二進制文件
各種模式可以組合:
rt,rt+,wt,rb,wb,at,ab。。。
//舉例說明:
FILE *fin, *fout;
fin = fopen("text1.txt", "r");
if (!fin)
printf("open file 1 failed! \n");
fout = fopen("text2.txt", "w");
if (!fopen)
printf("open file2 failed! \n");
4.返回值
正常返回:被打開文件的文件指針。
異常返回:NULL,表示打開操作不成功。
5,要說明的是:C語言將計算機的輸入輸出設備都看作是文件。例如,鍵盤文件、屏幕文件等。ANSI C標準規定,在執行程序時系統先自動打開鍵盤、屏幕、錯誤三個文件。這三個文件的文件指針分別是:標準輸入stdin、標準輸出stdout和標準出錯 stderr。
關閉文件
要注意的是讀寫完成后一定要記得關閉文件否則數據可能沒保存
1. 函數原型
int fclose(FILE *fp);
2. 功能說明
關閉由fp指出的文件。此時調用操作系統提供的文件關閉功能,關閉由fp->fd指出的文件;釋放由fp指出的文件類型結構體變量;返回操作結果,即0或EOF。
3. 參數說明
fp:一個已打開文件的文件指針。
4. 返回值
正常返回:0。
異常返回:EOF,表示文件在關閉時發生錯誤。
例如:
int n=fclose(fp);
//當然也不一定要檢測,可以直接寫出來:
fclose(fin);
fclose(fout);
具體的讀寫函數
A. 從文件中讀取一個字符
1. 函數原型
int fgetc(FILE *fp);
2. 功能說明
從fp所指文件中讀取一個字符。
3. 參數說明
fp:這是個文件指針,它指出要從中讀取字符的文件。
4. 返回值
正常返回: 返回讀取字符的代碼。
非正常返回:返回EOF。例如,要從"寫打開"文件中讀取一個字符時,會發生錯誤而返回一個EOF。
5. 實例
ch = fgetc(fin);
while (ch != EOF)
{
putchar(ch);
ch = fgetc(fin);//也就是說這個期間文件指針fp一直在移動
}
B. 寫一個字符到文件中去
1. 函數原型
int fputc(int ch,FILE *fp)
2. 功能說明
把ch中的字符寫入由fp指出的文件中去。
3. 參數說明
ch:是一個整型變量,內存要寫到文件中的字符(C語言中整型量和字符量可以通用)。
fp:這是個文件指針,指出要在其中寫入字符的文件。
4. 返回值
正常返回: 要寫入字符的代碼。
非正常返回:返回EOF。例如,要往"讀打開"文件中寫一個字符時,會發生錯誤而返回一個EOF。
5. 實例
//將in指向的文件復制到out指向的文件中去
ch=fgetc(in); //從in所指文件的當前指針位置讀取一個字符
while(ch!=EOF) //判斷剛讀取的字符是否是文件結束符
{
fputc(ch,out); //若不是結束符,將它寫入out所指文件
ch=fgetc(in); //繼續從in所指文件中讀取下一個字符
} //完成將in所指文件的內容寫入(復制)到out所指文件中
fclose(in); //關閉in所指文件
fclose(out); //關閉out所指文件
字符串:
C. 從文件中讀取一個字符串
1. 函數原型
char *fgets(char *str,int szie,FILE *fp)
2. 功能說明
從由fp指出的文件中讀取n-1個字符,并把它們存放到由str指出的字符數組中去,最后加上一個字符串結束符'\0'。
3. 參數說明
str:接收字符串的內存地址,可以是數組名,也可以是指針。
n: 指出要讀取字符的個數。
fp:這是個文件指針,指出要從中讀取字符的文件。
4. 返回值
正常返回:返回字符串的內存首地址,即str的值。
非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了文件尾,還是發生了錯誤。例如,要從"寫打開"文件中讀取字符串,將
發生錯誤而返回一個NULL值。
D. 寫一個字符串到文件中去
1. 函數原型
int fputs(char *str,FILE *fp)
2. 功能說明
把由str指出的字符串寫入到fp所指的文件中去。
3. 參數說明
str:指出要寫到文件中去的字符串。
fp:這是個文件指針,指出字符串要寫入其中的文件。
4. 返回值
正常返回: 寫入文件的字符個數,即字符串的長度。
非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了文件尾,還是發生了錯誤。例如,要往一個"讀打開" 文件中寫字符串時,會發生錯誤而返回一個NULL值。
//example:將一個文件的內容以追加形式添加到另一個文件
#include <stdio.h>
#define SIZE 512
void main()
{
char buffer[SIZE];
FILE *fp1, *fp2;
// 按追加方式打開argv[1] 所指文件
if ((fp1 = fopen("text1.txt", "a")) == NULL)
{
printf("The file text1 can not be opened.\n");
return;
}
if ((fp2 = fopen("text.txt", "r")) == NULL)
{
printf("The file text can not be opened.\n");
return;
}
// 讀入一行立即寫出,直到文件結束
while (fgets(buffer, SIZE, fp1) != NULL)
printf("%s\n", buffer);
while (fgets(buffer, SIZE, fp2) != NULL)
fputs(buffer, fp1);
fclose(fp1);
fclose(fp2);
if ((fp1 = fopen("text1.txt", "r")) == NULL)
{
printf("The file text1,line28 can not be opened.\n");
return;
}
while (fgets(buffer, SIZE, fp1) != NULL)
printf("%s\n", buffer);
fclose(fp1);
}
- 關于feof()函數
1. 函數原型
int feof(FILE *fp)
2. 功能說明
在文本文件(ASCII文件)中可以用值為-1的符號常量EOF來作為文件的結束符。但是在二進制文件中-1往往可能是一個有意義的數據,因此不能用它 來作為文件的結束標志。為了能有效判別文件是否結束,ANSI C提供了標準函數feof(),用來識別文件是否結束。
3. 參數說明
fp:文件指針。
4. 返回值
返回為非0值:已到文件尾。
返回為0值:表示還未到文件尾。
- 關于exit()函數
1. 函數原型
void exit(int status)
2. 功能說明
exit()函數使程序立即終止執行,同時將緩沖區中剩余的數據輸出并關閉所有已經打開的文件。
3. 參數說明
status:為0值表示程序正常終止,為非0值表示一個定義錯誤。
4. 返回值
無。