程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言進階【文件】常用文件操作函數詳解(一)

C語言進階【文件】常用文件操作函數詳解(一)

編輯:關於C語言

C語言學習筆記

之 關於文件操作函數

文件操作是C語言的最後篇章了,一起來看一下用C語言怎麼操作文件

一:文件指針

我們所說的文件不同於一個數據類型,比如一個test.txt文檔,它有自己的一些屬性,比如文件的當前位置、與該文件對應的內存緩沖區地址、文件操作方式等等。這些信息都在專門開辟一定空間的內存中存儲著。

在內存中存儲著是不錯,而且它們還保存在一個結構體類型的變量中,比如:

type struct
{
   int fd;//文件號
   int cleft;//緩沖區中剩下的字符
   int mode;//文件操作模式
   char *nextc;//下一個字符位置
   char *buff;//文件緩沖區位置
}FILE;
/*FILE是一個存儲文件信息的結構體類型的變量*/


在上述代碼中可以看到,文件號、文件操作模式等信息都存儲在一個結構體中。

這個結構體是系統自己定義的,定義在stdio.h頭文件中,取名為FILE,也就是說FILE是系統名稱,不可改變的,不是自定義。只要程序用到一個文件,系統就為此文件開辟一個如上的結構體變量。需要幾個文件,系統就開辟幾個這樣的結構體。

這些結構體變量不用變量名來標識,而是通過指向結構體類型的指針變量去訪問,這就是文件指針。

比如:FILE *fp1,*fp2,*fp3; 當引用文件時,就可以把這個文件的結構體首地址賦給某個文件指針*fp1),通過*fp1就可以調用結構體以找到相關的信息。

一般來說,有幾個文件就有幾個結構體,有幾個結構體就有幾個文件指針。

二:文件操作:文件的打開與關閉。

對磁盤文件的操作必須是先打開,然後讀寫,最後關閉。

打開和關閉扮演著重要的角色,打不開文件也就代表著我們要對文件的操作是徒勞的吧。

1.文件的打開

格式】fopen(文件名,文件使用方式)

說明】fopen庫函數,用來打開文件的函數,文件名為文件所在路徑,文件使用方式有如下幾種:

文件使用方式

含義

“r”只讀)

為輸入打開一個文本文件

“w”只寫)

為輸出打開一個文本文件

“a”追加)

想文本文件尾增加數據

“rb”只讀)

為輸入打開一個二進制文件

“wb”只寫)

為輸出打開一個二進制文件

“ab”追加)

向二進制文件尾增加數據

“r+”讀寫)

為讀寫打開一個文本文件

“w+”讀寫)

為讀寫打開一個新的文本文件

“a+”讀寫)

為讀寫打開一個文本文件

“rb+”讀寫)

為讀寫打開一個二進制文件

“wb+”讀寫)

為讀寫建立一個新的二進制文件

“ab+”讀寫)

為讀寫打開一個二進制文件

“t”文本文件)可以省略不寫


總結開來:就是r為讀 w為寫 b為二進制文件 a為追加 +為讀寫。可以組合使用

例如】

FILE *fp;
fp=fopen("e:\\test.txt","r");


含義是:在當前目錄下,打開e盤下的test.txt文檔,只允許“讀”操作,並使fp指向該文件。

返回值】如果不能成功打開,fopen將帶回一個數字0的返回值,這個0實際上在stdio.h文件中被定義為空指針值NULL。常用下面方法打開一個文件:

if((fp=fopen("e:\\test.txt","rt"))==NULL)
  {
     printf("\nConnot open file!");//如果打開不成功則顯示不能打開文件
 getchar();
 exit(1);//關閉所有文件,終止正調用的過程
  }


2.文件的關閉

文件的關閉是必不可缺少的操作,如果不關閉文件可能造成數據丟失等後果。

文件的關閉相對來說要簡單很多,只是一個執行命令而已。

格式】fclose(fp);

返回值】當順利關閉後,返回0,如果為非0值,則說明關閉有錯誤。

關閉的過程:先將緩沖區中尚未存盤的數據寫盤,然後撤銷存放該文件信息的結構體,最後令指向該文件的指針為空。

關閉完成後如果再想打開文件,則應重新打開。

三:文件的讀寫

常用的文件讀寫函數有三類:

字符讀寫函數:fgetc()和fputc() (getc和putc)

字符串讀寫函數:fgets()和fputs()

數據塊讀寫函數:fread()和fwrite()

格式化讀寫函數:fscanf()和fprintf()

1. 字符讀寫函數:fgetc()和fputc() (getc和putc)

字符讀寫函數是以字符字節)為單位的讀寫函數,也就是說每次操作都是讀入或寫入一個字符。

函數fgetc可以寫成getc,而fputc可以寫成putc。

1)fgetc()字符讀入函數

格式】ch=fgetc(pf)

含義】從pf所指定的文件中帶回一個字符賦給ch

返回值】如果執行fgetc讀字符時遇到文件結束符,函數返回一個文件結束標志EOF。EOF在stdio.h中定義為-1)

程序實例】

#include<stdio.h>
#include<stdlib.h>//exit在此頭文件中
main()
{
   FILE *fp;//定義文件指針
   char ch;
   /*判斷文件打開是否成功*/
   /*打開方式為rt,讀文件方式*/
   if((fp=fopen("e:\\test.txt","rt"))==NULL)
   {
      printf("\nConnot open file!");
  getchar();
  exit(1);
   }
   ch=fgetc(fp);//從fp所指文件中取出第一個字符
   /*從文件中取出所有字符,一個字符一個字符的顯示在中斷上*/
   while(ch!=EOF)
   {
      putchar(ch);//輸出一個字符
  ch=fgetc(fp);//取出一個字符
   }
   fclose(fp);
   printf("\n");
}


我們在e:\\test.txt下輸入如下內容然後保存。

224612729.png

然後執行程序,結果如下

224624303.png

注意】程序中的路徑一定要寫正確了

Fgetc函數調用時,讀取文件的方式必須是以讀或者是讀寫的方式打開的。

2)fputc()字符寫入函數

格式】fputc(ch,fp)

含義】將字符ch寫到文件指針fp所指的文件中。

返回值】如果寫入成功,返回寫入的內容ch,如果輸出失敗,則返回一個EOF值。

程序實例】

#include<stdio.h>
#include<stdlib.h>
main()
{
   FILE *fp;//定義文件指針
   char ch;
   /*判斷文件打開是否成功*/
   /*打開方式為wt,寫文件方式*/
   if((fp=fopen("e:\\test.txt","wt+"))==NULL)
   {
      printf("\nConnot open file!");
  getchar();
  exit(1);
   }
    /*輸入的字符一個一個的寫入到文件中*/
   printf("請輸入一個字符串\n");
   ch=getchar();
   while(ch!='\n')
   {
      fputc(ch,fp);//將ch寫入到文件中
  ch=getchar();
   }
   rewind(fp);//將文件的指針指向文件開頭
   /*用fgetc來輸出文件的內容*/
   printf("寫入文件的內容是:\n");
   ch=fgetc(fp);
   while(ch!=EOF)
   {
      putchar(ch);
  ch=fgetc(fp);
   }
   printf("\n");
   fclose(fp);
}

224637564.png

好了,程序顯示內容寫入test.txt文件中並且輸出了,我們找到e:\\test.txt下,打開test.txt看看是否有“李敏是個乖老婆”這句話。

224647718.png

可以看到的確是有了。

注意事項】

在上述程序中我們可以注意到這麼一個問題,test.txt文件中本來就有了其它的內容趙玉強的博客 http://zhaoyuqiang.blog.51cto.com),但是執行完上述程序後,文件中原來的內容不見了,取而代之的是新的內容李敏是個乖老婆),如果想原來內容不刪除的話,訪問方式應該改為a+(追加讀寫方式)打開。

關於之後的字符串函數、數據塊函數和格式化函數我們下一篇文章再一起看,今天實在困死了!j_0025.gif

本文出自 “趙玉強的博客” 博客,請務必保留此出處http://zhaoyuqiang.blog.51cto.com/6328846/1296902

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved