處理文件

在頭文件<stdio.h>中提供處理問件的庫函數。

文件的兩種類型:文本文件和二進制文件

文本文件:將數據寫入文本文件時,數據寫入爲字符,這些字符組成爲數據行,在每一行的末尾用換行結束。如果寫入的是二進制數據,例如int或者double類型,則先將其轉化成字符類型,在寫入文件

二進制文件:將數據寫入二進制文件時,總是寫入一系列字節,與他在內存中的表現形式相同,例如double類型就是寫入8個字節。

總結:字符數據本身在內存中就經過了編碼,所以無論是二進制還是文本形式都是一樣的,而對於非字符數據來說,例如inti=10;如果用二進制來進行存儲的話爲1010,但是如果需要用文本形式來進行存儲的話就必須進行格式化編碼(對1和0分別編碼,即形式爲‘1’和‘0’分別對應的碼值)。

打開文件

FILE *fopne( char *name, char *mode)

其中mode可以爲:“w”,“a”,“r”

當mode爲“w”或者“a“時,如果name爲一個包含目錄的路徑,而且其中有一部分目錄不存在,則返回NULL,否則如果只是一個文件名而且在當前目錄下沒有這個文件,則創建這個文件不返回NULL。

當mode爲”r“時,如果文件不存在,則返回NULL。

文件重命名

int rename(const char *oldname, const char *newname)

如果文件刪除成功,則返回0;如果文件刪除失敗,則返回非零值。

刪除文件

remove(char *naem)

刪除時,文件不應該是打開的。

清除緩衝區(將緩衝區中的數據寫入文件中)

fflush(pfile)

如果寫入成功的,則返回0;如果寫入失敗,返回EOF。

在文件中移動
獲得文件中的當前位置
int ftell(FILE *pfile)
返回long類型的變量,表示距離文件開頭的偏移字節數
int fgetpos(FILE *pfile, fpos_t *position)
成功,則在position中存儲當前位置和文件的狀態信息,並返回0,否則返回非零整數。
在文件中設定位置
int fseek(FILE *pfile, long offset, int origin)
對於文本文件,origin必須是SEEK_SET,成功,返回0;失敗,返回非零值。
int fsetpos(FILE *pfile, fpos_t *position )
成功,返回0;失敗,返回非零值。

創建臨時文件
FILE pfile;
pfile = tmpfile();
判斷是否到達文件尾
feof()
如果文件結束,則返回非0值,否則返回0.


文本文件操作

向文本文件中寫入一個字符

int fputc(int c, FILE *pflie)

寫入成功,返回寫入的字符;寫入失敗,返回EOF。

注意:fputc ()函數與putc()函數等價,唯一的區別就是putc()函數是一個宏,而fputc()實現爲一個函數。

從文本文件中讀取一個字符

int fgetc( FILE* pfile)

讀取成功,將返回讀取的字符;讀取失敗,則返回EOF。

注意:fgetc ()函數與getc()函數等價,唯一的區別就是getc()函數是一個宏,而fgetc()實現爲一個函數。


向文本文件中寫入字符串

int fputs( char *pstr, FILE *pfile)

將字符串寫入文件直到碰到‘\0’,但是‘\0’不會寫入文件。通常是寫入一行字符串最後加一個換行符。

寫入成功,返回0或者整數,否則返回EOF。

從文本文件中讀取字符串

char *fgets( char *pstr, int nchars, FILE *pfile)

從文本文件中讀取字符串,直到碰到‘\n’或者已經讀入nchars-1個字符爲止。

讀取成功,返回pstr指針;否則返回NULL。

格式化文件輸入輸出

輸入到文件:fprintf(FILE* pflie, ”格式字符串“, 變量);

從文件輸出:fscanf(FILE* pflie, ”格式字符串“, 變量);

注意:數據存放在文件中,只是存放字節,這些字節的意義取決與你怎麼解釋它們

代碼框架如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
  FILE *file1 = NULL;
  FILE *file2 = NULL;
  char str[] = "sdgfsdfgdsgfsdgd!";
  int len = strlen(str);
  int ch = 0;
  int const CHAR_MAX = 80;
  char *proverbs[] ={
    "sdgfsdgdfsgfdsgds\n",
    "dfgfsdgdfshhhhhhhfdgj",
    "sgdfsfdshsdfh"
    "dsgdfshdshds\n"
  };

  if(!(file1 = fopen("test1.txt", "w")))
  {
    printf("打開文件失敗");
    exit(1);//使用此函數必須引入stdlib.h頭文件
  }
  /*
    向文本文件中寫入一個字符
  */
  size_t i ;
  for ( i = 0; i < len; i++)
  {
    if( fputc(str[i], file1) != EOF )
    {
      printf("寫入%c成功\n", str[i] );
    }
  }


  /*
    向文本文件中寫入字符串
  */
  int count = sizeof(proverbs)/sizeof(proverbs[1]);
  size_t j ;
  for(j = 0; j < count; j++)
  {
    if ( fputs(proverbs[j], file1) != EOF) {
      printf("成功將字符串%s寫入文件\n", proverbs[j]);
    }else{
      printf("寫入字符串%s失敗\n", proverbs[j]);
    }
  }
  fflush(file1);
  fclose(file1);

  if (!(file2 = fopen("test1.txt", "r"))) {
    printf("打開文件失敗" );
    exit(1);
  }
  /*
    從文本文件中讀取一個字符

  while ( (ch = fgetc(file2)) != EOF) {
    printf("從文件中讀取%c成功!\n",ch );
  }
  */
  /*
    從文本文件中讀取字符串
  */
  char temp[CHAR_MAX];//char temp = NULL;不可以
  while( fgets(temp, CHAR_MAX, file2))
  {
    printf("從文本文件中讀取字符串:%s\n",temp );

  }
  fclose(file2);
  return 0;
}


注意:在將數據寫入文件之後並不可以馬上讀取,同樣,在讀取文件數據之後也不可以馬上寫文件。因爲將數據寫入到文件之後,並不是將數據寫到外部設備上,而是將其放入緩衝區中,直到緩衝區滿了或者發生其他情況,纔將數據寫入文件中。同理,當讀取文件數據的時候,會將數據讀取到緩衝區中,直到緩衝區的數據空了,纔會繼續從文件中讀取數據。因此,在讀模式和寫模式之間進行轉換的時候,需要使用fflush()函數刷新緩衝區。


二進制文件操作


寫入二進制文件
size_t fwrite( const void* buffer, size_t size, size_t count, FILE* pfile)
寫入成功,則返回與count一樣的數,否則,返回其真實寫入的數據的個數。
讀區二進制文件
size_t fread ( void *buffer, size_t size, size_t count, FILE *pfile)
讀取成功,則返回與count一樣的數,否則,返回其真實讀取的數據的個數。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章