最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解C語言中文件相關(guān)函數(shù)的使用

 更新時間:2022年07月20日 15:31:43   作者:蔣靈瑜的流水賬  
這篇文章主要為大家詳細介紹了C語言中文件相關(guān)函數(shù)的使用,可以實現(xiàn)文件的讀寫、打開和關(guān)閉。文中通過示例進行了詳細介紹,需要的可以參考一下

一、文件和流

1、程序文件

包括源程序文件(后綴為.c)

目標(biāo)文件(windows環(huán)境后綴為.obj)

可執(zhí)行程序(windows環(huán)境 后綴為.exe)

2、數(shù)據(jù)文件

文件的內(nèi)容不一定是程序,而是程序運行時讀寫的數(shù)據(jù),比如程序運行需要從中讀取數(shù)據(jù)的文件, 或者輸出內(nèi)容的文件。

3、流

任何一個C程序,運行起來就會默認打開3個流

1、FILE* stdin(標(biāo)準(zhǔn)輸入流,鍵盤)

2、FILE* stdout(標(biāo)準(zhǔn)輸出流,顯示器)

3、FILE* stderr(標(biāo)準(zhǔn)錯誤流,顯示器)

流可以理解為輸入/輸出緩沖區(qū)

二、文件組成

每個被使用的文件都在內(nèi)存中開辟了一個相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名 字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)聲明的,取名FILE

FILE*就是文件指針類型,可以通過文件指針找到它指向的文件信息區(qū)(FILE類型的結(jié)構(gòu)體),文件信息區(qū)用于維護一個文件(每個文件都是獨立的文件信息區(qū))

三、文件的打開和關(guān)閉

1、文件的打開fopen

filename是文件名

mode是文件打開方式

文件打開方式含義如果指定文件不存在
“r”(只讀)為了輸入數(shù)據(jù),打開一個已經(jīng)存在的文本文件出錯
“w”(只寫)為了輸出數(shù)據(jù),打開一個文本文件建立一個新的文件
“a”(追加)向文本文件尾添加數(shù)據(jù)建立一個新的文件
“rb”(只讀)為了輸入數(shù)據(jù),打開一個二進制文件出錯
“wb”(只寫)為了輸出數(shù)據(jù),打開一個二進制文件建立一個新的文件
“ab”(追加)向一個二進制文件尾添加數(shù)據(jù)出錯
“r+”(讀寫)為了讀和寫,打開一個文本文件出錯
“w+”(讀寫)為了讀和寫,新建一個文本文件建立一個新的文件
“a+”(讀寫)打開一個文件,在文件尾進行讀寫建立一個新的文件
“rb+”(讀寫)為了讀和寫打開一個二進制文件出錯
“wb+”(讀寫)為了讀和寫,新建一個新的二進制文件建立一個新的文件
“ab+”(讀寫)打開一個二進制文件,在文件尾進行讀和寫建立一個新的文件

2、文件關(guān)閉fclose

stream是文件指針,文件使用完后一定要fclose關(guān)閉,并把文件指針置空。(用起來像free)

int main()
{
    FILE* pf = fopen("text.txt", "r");//文件路徑可以是相對路徑或絕對路徑
    if (pf == NULL)
    {
        printf("%s\n", strerror(errno));
        exit(-1);
    }
    fclose(pf);//不關(guān)閉文件可能會造成數(shù)據(jù)丟失
    pf = NULL;
    return 0;
}

四、文件的順序讀寫

字符輸入函數(shù)fgetc所有輸入流
字符輸出函數(shù)fputc所有輸出流
文本行輸入函數(shù)fgets所有輸入流
文本行輸出函數(shù)fputs所有輸出流
格式化輸入函數(shù)fscanf所有輸入流
格式化輸出函數(shù)fprintf所有輸出流
二進制輸入fread文件
二進制輸出fread文件

1、使用fputc和fgetc寫入/讀取單個字符

寫入單個字符到文件

character:要寫入的字符

stream:指向輸出流 FILE 對象的指針。

int main()
{
    FILE* pf = fopen("text.txt", "w");//文件路徑可以是相對路徑或絕對路徑
    if (pf == NULL)
    {
        printf("%s\n", strerror(errno));
        //perror("fopen");//void perror ( const char * str )用來將上一個函數(shù)發(fā)生錯誤的原因輸出到標(biāo)準(zhǔn)設(shè)備(stderr)
        exit(-1);
    }
    for (char i = 'a'; i <= 'z'; i++)
    {
        fputc(i, pf);//輸出
    }
    fclose(pf);
    pf = NULL;
}

讀取文件中的單個字符

stream:指向輸入流 FILE 對象的指針。

int main()
{
    pf = fopen("text.txt", "r");//文件路徑可以是相對路徑或絕對路徑
    if (pf == NULL)
    {
        printf("%s\n", strerror(errno));
        exit(-1);
    }
    printf("%c\n", fgetc(pf));//輸入,也可以寫一個循環(huán)讀取
    printf("%c\n", fgetc(pf));
    printf("%c\n", fgetc(pf));
    printf("%c\n", fgetc(pf));
    printf("%c\n", fgetc(pf));
    fclose(pf);
    pf = NULL;
    return 0;
}

2、使用fputs和fgets寫入/讀取一串字符

寫入一串字符到文件

str:要寫入的字符串的地址

stream:指向輸出流 FILE 對象的指針。

int main()
{
    FILE* pf = fopen("text.txt", "w");
    if (pf == NULL)
    {
        perror("fopen:");
        exit(-1);
    }
    char arr[] = "abcde";//text.txt文件被寫入abcde
    fputs(arr, pf);
    fclose(pf);
    pf = NULL;
    return 0;
}

讀取文件中num個字符

str:讀到的字符串放到str指向的空間里去

num:讀取的字符串個數(shù)

stream:指向輸入流 FILE 對象的指針。

讀取成功:返回str的地址

讀取失敗或錯誤:返回空指針

監(jiān)視發(fā)現(xiàn),我們從文件中讀取5個字符,實際只讀了4個,最后一個補了\0

3、使用fprintf和fscanf按照指定的格式寫入/讀取

stream:指向輸出流 FILE 對象的指針。

后續(xù)參數(shù)使用方法與printf一樣

struct S
{
    char name[20];
    int tele;
    float scores;
};
int main()
{
    struct S s = { "zhangsan",1510,66.5f };
    FILE* pf = fopen("text.txt", "w");
    if (pf == NULL)
    {
        perror("fopen:");
        exit(-1);
    }
    fprintf(pf, "%s %d %f", s.name, s.tele, s.scores);//打印到txt文件
    fprintf(stdout, "%s %d %f", s.name, s.tele, s.scores);//打印到屏幕
    fclose(pf);
    pf = NULL;
    return 0;
}

stream:指向輸入流 FILE 對象的指針。

后續(xù)參數(shù)使用方法和scanf一樣

struct S
{
    char name[20];
    int tele;
    float scores;
};
int main()
{
    struct S s = { 0 };
    FILE* pf = fopen("text.txt", "r");
    if (pf == NULL)
    {
        perror("fopen:");
        exit(-1);
    }
    fscanf(pf, "%s %d %f", s.name, &s.tele, &s.scores);//將文件中的內(nèi)容讀取到結(jié)構(gòu)體中
    printf("%s %d %f", s.name, s.tele, s.scores);
    fclose(pf);
    pf = NULL;
    return 0;
}

4、使用fwrite和fread按照二進制的方式寫入/讀取

ptr:從ptr指向的當(dāng)前位置開始寫入

size:每個元素的大小

count:要寫入的元素個數(shù)

stream:指向輸出流 FILE 對象的指針。

struct S
{
    char name[20];
    int tele;
    float scores;
};
int main()
{
    struct S s = { "zhangsan",1510,66.5f };
    FILE* pf = fopen("text.txt", "wb");
    if (pf == NULL)
    {
        perror("fopen:");
        exit(-1);
    }
    fwrite(&s, sizeof(struct S), 1, pf);
    fclose(pf);
    pf = NULL;
    return 0;
}

fread參數(shù)和fwrite一樣

ptr:從ptr指向的當(dāng)前位置開始讀取

struct S
{
    char name[20];
    int tele;
    float scores;
};
int main()
{
    struct S s = { 0 };
    FILE* pf = fopen("text.txt", "rb");
    if (pf == NULL)
    {
        perror("fopen:");
        exit(-1);
    }
    fread(&s, sizeof(struct S), 1, pf);
    printf("%s %d %f", s.name, s.tele, s.scores);
    fclose(pf);
    pf = NULL;
    return 0;
}

5、使用sprintf和sscanf將格式化數(shù)據(jù)和字符串互相轉(zhuǎn)換(文件無關(guān))

將格式化數(shù)據(jù)轉(zhuǎn)換為字符串

str:將格式化數(shù)據(jù)放到目標(biāo)地址

后續(xù)參數(shù)和使用方式和printf一樣

struct S
{
    char name[20];
    int tele;
    float scores;
};
int main()
{
    struct S s = { "zhangsan",1510,66.5f };
    char arr[60]={0};
    sprintf(arr, "%s %d %f", s.name, s.tele, s.scores);
    printf("%s", arr);
    return 0;
}

將字符串轉(zhuǎn)換為格式化數(shù)據(jù)

s:指向字符串的指針

后續(xù)參數(shù)和使用方式和scanf一樣

struct S
{
    char name[20];
    int tele;
    float scores;
};
int main()
{
    struct S s = { 0 };
    char arr[60]={ "zhangsan 1510 66.5f" };
    sscanf(arr, "%s %d %f", s.name, &s.tele,&s.scores);
    printf("%s %d %f", s.name,s.tele,s.scores );
    return 0;
}

五、文件的隨機讀寫

1、fseek(指定文件指針的位置)

注意:每次文件讀取完畢后,文件指針++

stream:指向標(biāo)識流的 FILE 對象的指針

offset:指針偏移量

origin:指針起始點,如下圖:

SEEK_SET文件開頭
SEEK_CUR文件指針的當(dāng)前所處的位置
SEEK_END文件結(jié)尾
int main()
{
    FILE* pf = fopen("text.txt", "r+");
    if (pf == NULL)
    {
        perror("fopen:");
        exit(-1);
    }
    fputs("abcde", pf);
    fseek(pf, 2, SEEK_SET);
    int ch = fgetc(pf);//該語句執(zhí)行完畢后,指針++,指向d
    printf("%c ", ch);//打印c
 
    fseek(pf, 0, SEEK_CUR);
    ch = fgetc(pf); //該語句執(zhí)行完畢后,指針++,指向e
    printf("%c ", ch);//打印d
 
    fseek(pf, -1, SEEK_END);//這里SEEK_END是指向e的后一個
    ch = fgetc(pf);//該語句執(zhí)行完畢后,指針++,指向e的后一個
    printf("%c ", ch);//打印e
    fclose(pf);
    pf = NULL;
    return 0;
}

2、ftell(求文件指針與起始位置的偏移量)

int main()
{
    FILE* pf = fopen("text.txt", "r+");
    if (pf == NULL)
    {
        perror("fopen:");
        exit(-1);
    }
    fputs("abcde", pf);
    fseek(pf, -1, SEEK_END);//這里SEEK_END是指向e的后一個
    int ch = fgetc(pf);//該語句執(zhí)行完畢后,指針++,指向e的后一個
    printf("%c ", ch);//打印e
    printf("%d", ftell(pf));//打印5,當(dāng)前指針在e的后一個,相對于a相差5
    fclose(pf);
    pf = NULL;
    return 0;
}

3、rewind(讓文件指針回到起始位置)

六、文本文件和二進制文件的區(qū)別

數(shù)據(jù)在內(nèi)存中以二進制的形式存儲,如果不加轉(zhuǎn)換的輸出到外存,就是二進制文件。

如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉(zhuǎn)換。以ASCII字符的形式存儲的文件就是文本文件。 字符一律以ASCII形式存儲,數(shù)值型數(shù)據(jù)既可以用ASCII形式存儲,也可以使用二進制形式存儲。

七、文件讀取結(jié)束的標(biāo)志

文本文件讀取是否結(jié)束,fgetc判斷返回值是否為 EOF . fgets判斷返回值是否為 NULL

二進制文件的讀取結(jié)束判斷,判斷返回值是否小于實際要讀的個數(shù)。 例如: fread判斷返回值是否小于還是等于實際要讀的個數(shù)。

feof:判斷文件是否讀到末尾而結(jié)束,返回值為真,就是讀到了文件結(jié)束

ferror:判斷文件是否讀取錯誤而結(jié)束,返回值為真,就是文件讀取遇到了錯誤

八、文件緩沖區(qū)

ANSIC 標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)”處理的數(shù)據(jù)文件的,所謂緩沖文件系統(tǒng)是指系統(tǒng)自動地在內(nèi)存中為程序中每一個正在使用的文件開辟一塊“文件緩沖區(qū)”。

從內(nèi)存向磁盤輸出數(shù)據(jù)會先送到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤上。

如果從磁盤向計算機讀入數(shù)據(jù),則從磁盤文件中讀取數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再從緩沖區(qū)逐個地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(程序變量等)。緩沖區(qū)的大小根據(jù)C編譯系統(tǒng)決定的。

到此這篇關(guān)于一文詳解C語言中文件相關(guān)函數(shù)的使用的文章就介紹到這了,更多相關(guān)C語言文件相關(guān)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言按關(guān)鍵字搜索文件夾中文件的方法

    C語言按關(guān)鍵字搜索文件夾中文件的方法

    這篇文章主要介紹了C語言按關(guān)鍵字搜索文件夾中文件的方法,涉及C語言文件操作及字符串查找的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C++ 實現(xiàn)2048游戲示例

    C++ 實現(xiàn)2048游戲示例

    《2048》是比較流行的一款數(shù)字游戲。原版2048首先在github上發(fā)布,原作者是Gabriele Cirulli。它是基于《1024》和《小3傳奇》的玩法開發(fā)而成的新型數(shù)字游戲。
    2014-06-06
  • C++統(tǒng)計軟件使用時間代碼示例

    C++統(tǒng)計軟件使用時間代碼示例

    這篇文章主要介紹了C++統(tǒng)計軟件使用時間的小程序,大家可以參考使用
    2013-11-11
  • C++ 實現(xiàn)漢諾塔的實例詳解

    C++ 實現(xiàn)漢諾塔的實例詳解

    這篇文章主要介紹了C++ 實現(xiàn)漢諾塔的實例詳解的相關(guān)資料,這里主要說明C++中數(shù)據(jù)結(jié)構(gòu)的遞歸的應(yīng)用,需要的朋友可以參考下
    2017-08-08
  • 淺談在函數(shù)中返回動態(tài)的內(nèi)存

    淺談在函數(shù)中返回動態(tài)的內(nèi)存

    下面小編就為大家?guī)硪黄獪\談在函數(shù)中返回動態(tài)的內(nèi)存。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++基本算法思想之窮舉法

    C++基本算法思想之窮舉法

    在使用窮舉法時,需要明確問題的答案的范圍,這樣才可以在指定的范圍內(nèi)搜索答案。指定范圍之后,就可以使用循環(huán)語句和條件語句逐步驗證候選答案的正確性,從而得到需要的正確答案
    2013-10-10
  • VS及Unity安裝和使用Nuget包

    VS及Unity安裝和使用Nuget包

    本文主要介紹了VS及Unity安裝和使用Nuget包,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 基于C++和MFC開發(fā)象棋程序

    基于C++和MFC開發(fā)象棋程序

    這篇文章主要為大家詳細介紹了基于C++和MFC開發(fā)象棋程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C++實現(xiàn)希爾排序(ShellSort)

    C++實現(xiàn)希爾排序(ShellSort)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)希爾排序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++ 搬水果貪心算法實現(xiàn)代碼

    C++ 搬水果貪心算法實現(xiàn)代碼

    這篇文章主要介紹了C++ 搬水果貪心算法實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論

无棣县| 桃园市| 萨迦县| 新干县| 大邑县| 华坪县| 镇安县| 浑源县| 山西省| 沂源县| 滨海县| 乌拉特后旗| 额尔古纳市| 绥芬河市| 霞浦县| 平南县| 岳普湖县| 安泽县| 萨嘎县| 兴山县| 孟州市| 焦作市| 连山| 平山县| 吉木乃县| 那坡县| 南乐县| 尉犁县| 东至县| 商南县| 巴彦县| 错那县| 崇明县| 页游| 广水市| 如东县| 宣汉县| 牙克石市| 宾川县| 唐海县| 永安市|