1. 程式人生 > >檔案IO操作大全

檔案IO操作大全

一、檔案基本知識

“檔案是指一組相關資料的有序集合”,這個資料集的名稱就是檔名。所有檔案都是通過流的形式進行輸入輸出操作的。流是一個數據位元組的序列。流入程式的流稱為輸入流,流出程式的流稱為輸出流。

流可分為兩大類:文字流二進位制流

(1)文字劉是一種字元序列,僅包含字元。

(2)二進位制流是一種二進位制序列,與外設中的位元組序列一一對應,不對位元組中的內容進行轉換,如遇到換行符也不會執行換行操作。

文字又可以分為文字檔案二進位制文字檔案兩大類。

(1)文字檔案又稱ASCII檔案,也稱字元檔案。這種檔案儲存時,每個字元對應一個位元組,用於存放對應的ASCII碼。可通過輸出裝置顯示,是我們能夠讀懂的內容。

(2)二進位制檔案是由0和1組成的一段序列,用二進位制的方式儲存檔案內容。雖然二進位制也能夠輸出顯示,但是隻有機器能夠讀懂它的意思。

二、檔案的基本操作

1.檔案指標

檔案指標是緩衝檔案系統中的關鍵概念,C系統為每個開啟的檔案在記憶體中開闢一個緩衝區,用於存放檔案的有關資訊,這些資訊包括檔名,狀態和檔案儲存位置等等。

檔案指標是一個有指向檔案有關資訊的指標,它儲存在FILE結構體變數中。該結構體型別由系統定義,宣告如下:

typedef struct
{
    short level;                /*緩衝區的使用量*/
    unsigned flags;             /*標誌檔案狀態*/
    char fd;                    /*檔案號*/
    unsigned char hold;         /* 無緩衝區取消字元輸入*/
    short bsize;                /*緩衝區大小預設值512*/
    unsigned char *buffer;      /*緩衝區指標*/
    unsigned ar *curp;          /*無活動指標*/
    unsigned istemp;            /*草稿檔案標識*/
    short token;                /*做正確性檢測*/
}FILE;

2.檔案開啟fopen()和關閉fclose()

(1)檔案開啟fopen()

fopen()函式是ANSIC規定的標準輸入/輸出函式庫中的函式。開啟檔案的操作就是建立一個流。

標頭檔案:#include <stdio.h>

函式呼叫形式:fp = fopen("檔名","使用檔案方式");

功能:以某種使用方式開啟檔案

返回值:若檔案開啟成功返回 一個有確定指向的FILE指標,開啟失敗則返回NULL。

使用方式含義

r開啟只讀檔案,該檔案必須存在。
r+開啟可讀寫的檔案,該檔案必須存在。
w開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。


a以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。
a+以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。

rb開啟一個二進位制檔案,只允許讀資料

rb+開啟一個二進位制檔案,允許讀和寫

wb開啟或建立一個二進位制檔案,只允許寫資料

wb+開啟或建立一個二進位制檔案,允許讀和寫

ab開啟一個二進位制檔案,並在檔案末尾寫資料

ab+開啟一個二進位制檔案,允許讀,或在檔案末追加資料

總結以上使用方式的特點:

①r(read)代表讀,w(write)代表寫,a(append)追加。

②r為開啟只讀檔案,即檔案存在才能讀;w為開啟只寫檔案,若檔案不存在則建立,檔案存在則先將檔案內容清空再寫資料;a為追加的方式寫入資料,即檔案不存在則建立,若檔案存在,原檔案內容不清空,並在末尾寫入資料。

③b代表二進位制的標識,意思是對二進位制檔案操作

④+代表可讀和可寫

(2)檔案關閉fcolse()

檔案使用完畢後,應將其關閉,關閉的意思是檔案指標變數不再指向該檔案。如果不將已開啟的檔案關閉的話,是危險的。

標頭檔案:#include <stdio.h>

函式呼叫形式:fclose(檔案指標名);

功能:關閉檔案指標fp指向的檔案

返回值:若正常關閉檔案返回值為0,關閉失敗則返回EOF(即-1)。

3.檔案讀/寫函式

(1)寫字元函式——fputc()

標頭檔案:#include <stdio.h>

函式呼叫形式:fputc(字元,檔案指標名);

功能:把一個字元寫到fp所指向的檔案中去。

返回值:輸出成供返回值就是輸出的字元,輸出失敗返回EOF(即-1)

函式實現:通過fputc寫入一個字元到fputc.txt檔案中

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp;//定義一個指向FILE型別結構體的指標變數fp
    char ch;
    if((fp = fopen("C:\\Users\\Administrator\\Desktop\\fputc.txt","w")) == NULL)//以只寫方式開啟檔案,這裡注意是用兩個“\”
    {
        printf("開啟檔案失敗!\n");
        exit(0);
    }
    ch = getchar();     //獲取從鍵盤輸入的字元
    while(ch != '#')    //輸入#停止輸入
    {
        fputc(ch,fp);   //將ch字元寫入到檔案中
        ch = getchar();
    }
    fclose(fp);         //關閉fp指向的檔案
    return 0;
}


(2)讀字元函式——fgetc()

標頭檔案:#include <stdio.h>

函式呼叫形式:字元變數 = fgetc(檔案指標名);

功能:從檔案指標指向的磁碟檔案中讀取一個字元

返回值:函式遇到檔案結束符時將返回一個檔案結束標誌EOF(即-1)。

函式實現:通過fgetc讀出fgetc.txt檔案中內容

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp;//定義一個指向FILE型別結構體的指標變數fp
    char ch;
    if((fp = fopen("C:\\Users\\Administrator\\Desktop\\fgetc.txt","r")) == NULL)//以只讀方式開啟檔案,檔案必須存在
    {
        printf("開啟檔案失敗!\n");
        exit(0);
    }
    ch = fgetc(fp);     //獲取從鍵盤輸入的字元
    while(ch != EOF)    //輸入#停止輸入
    {
        putchar(ch);    //將ch字元寫入到檔案中
        ch = fgetc(fp); //重複使用fgetc讀取檔案內容
    }
    fclose(fp);         //關閉fp指向的檔案
    return 0;
}


(3)寫字串函式——fputs()

標頭檔案:#include <stdio.h>

函式呼叫形式:fputs(字串,檔案指標);

功能:向指定的檔案寫入一個字串,其中字串可以是字串常量,也可以是字元陣列名、指標或變數

返回值:若成功則返回寫出的字元個數,返回EOF則表示有錯誤發生。

函式實現:使用fputs向指定的磁碟檔案寫入字串

#include <stdio.h>
#include <process.h>
int main()
{
    FILE *fp;
    char filename[30],str[30];
    printf("請輸入檔案路徑:\n");
    scanf("%s",filename);
    if((fp = fopen(filename,"w")) == NULL)//以只寫方式開啟檔案
    {
        printf("開啟檔案失敗!\n");
        getchar();//輸入任意鍵繼續
        exit(0);
    }
    printf("請輸入字串:\n");
    getchar();
    gets(str);
    fputs(str,fp);  //將str寫入到指定的檔案中
    fclose(fp);     //關閉檔案
    return 0;
}


(4)讀字串函式——fgets()

標頭檔案:#include <stdio.h>

函式呼叫形式:fgets(字元陣列名,n,檔案指標)

功能:從指定的檔案中讀取一個字串到字元陣列中。n表示所得到的字串中字元的個數。

返回值:若成功則返回陣列首地址,返回NULL則表示有錯誤發生。

函式實現:使用fgets()讀取磁碟檔案中的檔案內容

#include <stdio.h>
#include <process.h>
int main()
{
    FILE *fp;
    char filename[30],str[100];
        printf("請輸入檔案路徑:\n");
    scanf("%s",filename);
    if((fp = fopen(filename,"r")) == NULL)//以只讀方式開啟檔案
    {
        printf("開啟檔案失敗!\n");
        getchar();//輸入任意鍵繼續
        exit(0);
    }
    fgets(str,sizeof(str),fp);//讀出檔案中的內容,若成功則返回str的內容
    printf("%s\n",str);
    fclose(fp);     //關閉檔案
    return 0;
}

(5)格式化寫入函式——fprintf()

格式化就是把想要輸出的資料,按照一定的格式輸出。

標頭檔案:#include <stdio.h>

函式呼叫形式:ch = fprintf(檔案型別指標,格式字串,輸出列表)

功能:fprintf(fp,"%d",i);將整型變數i的值按%d的格式輸出到fp所指向的檔案上。

返回值:成功時返回轉換的位元組數,失敗時返回一個負數

函式實現:使用fprintf將數字以字元形式寫入磁碟檔案

#include <stdio.h>
#include <process.h>
int main()
{
    FILE *fp;
    int i = 65;
    char filename[30];
    printf("請輸入檔案路徑:\n");
    scanf("%s",filename);
    if((fp = fopen(filename,"w")) == NULL)//以只寫方式開啟檔案
    {
        printf("開啟檔案失敗!\n");
        getchar();//輸入任意鍵繼續
        exit(0);
    }
    fprintf(fp,"%c",i);
    fclose(fp);     //關閉檔案
    return 0;
}

(6)格式化讀取函式——fscanf()

標頭檔案:#include <stdio.h>

函式呼叫形式:ch = fprintf(檔案型別指標,格式字串,輸入列表)

功能:fprintf(fp,"%d",i);讀入fp所指向的檔案上的i值

返回值:成功時返回轉換的位元組數,失敗時返回一個負數

函式實現:使用fscanf將磁碟中的字元以整數形式輸出

#include <stdio.h>
#include <process.h>
int main()
{
    FILE *fp;
    int i ,j;
    char filename[30];
    printf("請輸入檔案路徑:\n");
    scanf("%s",filename);
    if((fp = fopen(filename,"r")) == NULL)//以只讀方式開啟檔案
    {
        printf("開啟檔案失敗!\n");
        getchar();//輸入任意鍵繼續
        exit(0);
    }
    for(i = 0 ; i < 14 ; i++)
    {
        fscanf(fp,"%c",&j);
        printf("%d 是 : %5d\n",i+1,j);
    }
    fclose(fp);     //關閉檔案
    return 0;
}



(7)資料塊讀/寫函式——fread()/fwrite)()

標頭檔案:#include <stdio.h>

函式呼叫形式:fread(buffer,size,count,fp)fwrite(buffer,size,count,fp);

功能:從fp所指的檔案中讀入/寫入count次,每次讀出大小為size個位元組,並將讀入/輸出的資訊儲存在buffer地址中

返回值:若成功返回實際/讀入/寫入的count數目

函式實現:使用fread和fwrite實現將錄入的通訊錄資訊儲存到磁碟檔案中,在錄入完資訊後,要將所錄入的資訊全部顯示出來。

#include <stdio.h>
#include <process.h>
struct address_list
{
    char name[10];
    char adr[20];
    char tel[15];
}info[100];

void save(char *name,int n)
{
    FILE *fp;
    int i;
    if((fp = fopen(name,"wb")) == NULL)//以只寫方式開啟二進位制檔案
    {
        printf("開啟檔案失敗!\n");
        exit(0);
    }
    for(i = 0 ; i < n ; i++)
        if(fwrite(&info[i],sizeof(struct address_list),1,fp) != 1)
            printf("檔案寫入失敗!\n");
    fclose(fp);
}

void show(char *name,int n)
{
    int i;
    FILE *fp;
    if((fp = fopen(name,"rb")) == NULL)//以只讀方式開啟二進位制檔案
    {
        printf("開啟檔案失敗!\n");
        exit(0);
    }
    for(i = 0 ; i < n ; i++)
    {
        fread(&info[i],sizeof(struct address_list),1,fp);
        printf("%15s%20s%20s\n",info[i].name,info[i].adr,info[i].tel);
    }
    fclose(fp);
}

int main()
{
    int i,n;
    char filename[30];
    printf("請輸入學生個數:");
    scanf("%d",&n);
    printf("請輸入檔案路徑:\n");
    scanf("%s",filename);
    printf("請輸入學生的姓名、地址和電話:\n");
    for( i = 0 ; i < n ; i++)
    {
        printf("NO.%d",i+1);
        scanf("%s%s%s",info[i].name,info[i].adr,info[i].tel);
        save(filename,n);
    }
    show(filename,n);
    return 0;
}

4.定位檔案

(1)隨記讀寫操作——fseek()

標頭檔案:#include <stdio.h>

函式呼叫形式:fseek(檔案型別指標,位移量,起始點);

功能:用來移動檔案內部位置指標。位移量表示移動的位元組數,要求位移量是long型資料,以便在檔案長度大於64kb時不會出錯

起始點的表示方法

檔案首  :表示符號為SEEK-SET,數字表示0

檔案當前位置:表示符號為SEEK-CUR,數字表示1

檔案末尾:表示符號為SEEK-END,數字表示2

函式實現:向任意一個二進位制檔案中寫入一個長度大於7的字串,然後從該字串的第7個字元開始輸出餘下字元。

#include <stdio.h>
#include <process.h>
int main()
{
    FILE *fp;
    int i ,j;
    char filename[30],str[50];
    printf("請輸入檔案路徑:\n");
    scanf("%s",filename);
    if((fp = fopen(filename,"wb")) == NULL)//以只寫方式開啟二進位制檔案
    {
        printf("開啟檔案失敗!\n");
        getchar();//輸入任意鍵繼續
        exit(0);
    }
    printf("請輸入字串:\n");
    getchar();
    gets(str);
    fputs(str,fp);  //將str寫入到指定的檔案中
    fclose(fp);     //關閉檔案
    if((fp = fopen(filename,"rb")) == NULL)//以只讀方式開啟二進位制檔案
    {
        printf("開啟檔案失敗!\n");
        getchar();//輸入任意鍵繼續
        exit(0);
    }
    fseek(fp,6l,0);
    fgets(str,sizeof(str),fp);
    putchar('\n');
    puts(str);
    fclose(fp);     //關閉檔案
    return 0;
}

(2)返回位置指標——rewind()

標頭檔案:#include <stdio.h>

函式呼叫形式:int rewind(檔案型別指標);

功能:使位置指標重新返回檔案的開頭

函式實現:先輸出一個檔案的內容,再使用rewind返回檔案開頭,再輸出一次。

#include <stdio.h>
#include <process.h>
int main()
{
    FILE *fp;
    char ch,filename[30];
    printf("請輸入檔案路徑:\n");
    scanf("%s",filename);
    if((fp = fopen(filename,"r")) == NULL)//以讀方式開啟二進位制檔案
    {
        printf("開啟檔案失敗!\n");
        exit(0);
    }
    ch = fgetc(fp);
    while(ch != EOF)
    {
        putchar(ch);
        ch = fgetc(fp);
    }
    printf("\n");
    rewind(fp);
    ch = fgetc(fp);
    while(ch != EOF)
    {
        putchar(ch);
        ch = fgetc(fp);
    }
    printf("\n");
    fclose(fp);     //關閉檔案
    return 0;
}



(3)得到檔案位置——ftell()

標頭檔案:#include <stdio.h>

函式呼叫形式:long ftell(檔案型別指標);

功能:得到流式檔案中的當前位置,用相對於檔案開頭的位移量來表示

返回值:當返回值為-1L時表示出錯。

函式實現:使用ftell求檔案中的字串長度

#include <stdio.h>
#include <process.h>
int main()
{
    FILE *fp;
    int n;
    char ch,filename[30];
    printf("請輸入檔案路徑:\n");
    scanf("%s",filename);
    if((fp = fopen(filename,"r")) == NULL)//以讀方式開啟檔案
    {
        printf("開啟檔案失敗!\n");
        exit(0);
    }
    ch = fgetc(fp);
    while(ch != EOF)
    {
        putchar(ch);
        ch = fgetc(fp);
    }
    n = ftell(fp);
    printf("\n這個字串的長度為:%d\n",n);
    fclose(fp);     //關閉檔案
    return 0;
}



相關推薦

檔案IO操作大全

一、檔案基本知識 “檔案是指一組相關資料的有序集合”,這個資料集的名稱就是檔名。所有檔案都是通過流的形式進行輸入輸出操作的。流是一個數據位元組的序列。流入程式的流稱為輸入流,流出程式的流稱為輸出流。 流可分為兩大類:文字流和二進位制流 (1)文字劉是一種字元序列,僅包含字元

Linux程式設計——檔案 IO操作

   Linux檔案 I\O 介紹     1. Linux系統呼叫     Linux系統呼叫(system call)是指作業系統提供給使用者程式的一組“特殊介面”,使用者程式可以通過這組“特殊”介面來

Linux檔案IO操作

Linux檔案IO操作包括開啟(open),建立(create),讀(read),寫(write) 開啟open int open(const char *path, int oflags); int open(const char *path, int oflag

C#:檔案IO操作 FileStream的用法 及 StreamReader 和 StreamWriter的用法

1. FileStream 用法程式碼 static void Main(string[] args) { //memory : 記憶體 //Binary : 二進位制 String path = @"F:\ly\tes

Python中的檔案IO操作(讀寫檔案、追加檔案

【注】:下述操作過程是結合多種網路方法,然後自己實踐的結果。寫在這裡,主要目的是加深記憶,也希望能幫助後來者 Python中檔案的讀寫包含三個步驟:開啟檔案,讀/寫檔案,關閉檔案。 檔案開啟之後必

檔案IO操作的最佳實踐

文章概要 已經過去的中介軟體效能挑戰賽,和正在進行中的 第一屆 PolarDB 資料效能大賽 都涉及到了檔案操作,合理地設計架構以及正確地壓榨機器的讀寫效能成了比賽中獲取較好成績的關鍵。正在參賽的我收到了幾位公眾號讀者朋友的反饋,他們大多表達出了這樣的煩惱:“對比賽很感興趣,但不知道怎麼

C++ 檔案IO操作 讀寫

#include <iostream> #include <iomanip> #include <fstream> #include <stdlib.h> #include <vector> u

linux系統程式設計-檔案IO操作

四個主要的系統呼叫函式解釋 open() 函式可以開啟一個已經存在的檔案,也能建立並開啟一個檔案 #include <sys/stat.h> #include <fcntl

檔案io操作

//檔案寫入SD卡操作 public class Main extends Activity { /* Called when the activity is first created.

C#檔案IO操作

一、檔案系統概述     計算機系統的重要作用之一是能快速處理大量資訊,因此資料的組織和存取成為一個極為重要的內容。檔案是資訊的一種組織形式,而檔案系統的的目標就是提高儲存器的利用率,接受使用者的委託實施對檔案的操作。       檔案系統是作業系統的一個重要組成部分。檔案系

樹莓派學習筆記——使用檔案IO操作GPIO SysFs方式

0 前言    本文描述如果通過檔案IO sysfs方式控制樹莓派 GPIO埠。通過sysfs方式控制GPIO,先訪問/sys/class/gpio目錄,向export檔案寫入GPIO編號,使得該GPIO的操作介面從核心空間暴露到使用者空間,GPIO的操作介面包括direction和value等,direct

imx6用檔案io操作gpio

要讓linux支援檔案io方式操作gpio,首先驅動必須得支援,也就是說裝置樹上必須先配置好gpio模式,然後參照以上鍊接去實現gpio操作這裡舉例來說:hud專案中(imx6dl平臺),有一個藍芽電源的使能受GPIO1_IO30的控制,所以我們必須得在裝置樹上配置這個pad

[IO系統]02 使用者態的檔案IO操作

在工作中,經常會進行檔案建立、更新、刪除等操作,但是作為儲存領域技術人員,我們又對其過程瞭解多少哪。本系列文章將會對檔案操作進行系統的分析和梳理,與大家共同進步。先來了解使用者態的檔案操作的常用函式。1. “緩衝”檔案系統 – 使用者態帶快取(與檔案系統沒有關係)緩衝檔案系統

Linux檔案IO操作常用函式

1.Linux檔案的概念 Linux系統中,一切皆是檔案。無論是鍵盤、滑鼠、顯示屏以及其它裝置,在Linux系統眼中,它們都只是檔案,僅此而已。這就意味著計算機程式可以像使用檔案一樣操控所有的外設。操作檔案(外設)的函式還是比較多的,但是常用的就那麼幾個:open、clos

檔案IO操作程式設計

通過一個簡單的copy程式,完成檔案的複製程式,瞭解基本的檔案I/O檔案讀寫的基本步驟./command file1 file2 把檔案1的內容複製到檔案2如果檔案2不存在則建立-------------------------------------------------

Python的非同步檔案IO操作

前一篇提到了用subprocess進行與應用的stdin和stdout互動,目前還是stdout處理得多。專案有這樣的要求,需要程式碼能過同時在Linux和Windows下用,為防止應用掛起,需要進行非同步IO操作,這樣可通過timeout來處理超時。 麻煩問題又來了:Py

Linux標準檔案IO操作

 Linux檔案操作中的標準IO在實際開發過程中比較常用,現將常用的一些標準IO函式進行整理如下。 檔案IO就是對檔案的輸入輸出。對於linux來說,linux的一切都是檔案,包括資料夾。

java安全編碼指南之:檔案IO操作

[toc] # 簡介 對於檔案的IO操作應該是我們經常會使用到的,因為檔案的複雜性,我們在使用File操作的時候也有很多需要注意的地方,下面我一起來看看吧。 # 建立檔案的時候指定合適的許可權 不管是在windows還是linux,檔案都有許可權控制的概念,我們可以設定檔案的owner,還有檔案的pe

java.io常見流/java.io.file檔案操作大全

http://wosyingjun.iteye.com/blog/1885786 今天學習了下java的IO流,這裡做個總結,方便查詢。 InputStream/OutputSrteam InputStream是個抽象類,表示位元組輸入流的所有類的超類。常見的有向檔案寫

JAVA中IO流文字檔案操作(BufferedWriter和BufferedReader 緩衝區)

JAVA 中 字元流的緩衝區 分為了BufferedWriter 和BufferedReader 先講BufferedWriter 作用: 緩衝區要結合流才可以使用,而且在流的基礎上對流的功能進行了增強。我們也可以說,在我們以後的實際運用之中,為了增強一下I