溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語言怎么實(shí)現(xiàn)對(duì)文件進(jìn)行操作

發(fā)布時(shí)間:2023-04-19 11:23:44 來源:億速云 閱讀:107 作者:iii 欄目:開發(fā)技術(shù)

這篇“C語言怎么實(shí)現(xiàn)對(duì)文件進(jìn)行操作”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C語言怎么實(shí)現(xiàn)對(duì)文件進(jìn)行操作”文章吧。

文件指針

向文件里輸出或讀取數(shù)據(jù)需要使用文件指針的形式,每個(gè)文件指針可以用來打開一個(gè)文件,這個(gè)文件指針指向文件的文件信息區(qū)。

FILE * 變量名

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

文件使用完之后要記得關(guān)閉,不讓會(huì)占用資源,文件關(guān)閉掉之后要記得把指針置空以免出現(xiàn)野指針

//打開文件
FILE * fopen ( const char * filename, const char * mode );
//關(guān)閉文件
int fclose ( FILE * stream );

文件的打開方式

文件使用方式    文件使用方式    如果指定文件不存在

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

代碼示例

#include <stdio.h>
int main()
{
    FILE *pf = fopen("test.txt",'w');
    if(pf==NULL)
    {
        perror("FOPEN:");        //對(duì)文件指針進(jìn)行判斷以免返回空指針;
    }
    fput("haohaoxuexi,tiantianxiangshang",pf);
    fclose(pf);
    pf=NULL;            //文件關(guān)閉之后把指針置為空,以免出現(xiàn)野指針
}

&lsquo; w &rsquo; 沒有文件的情況下會(huì)新建一個(gè)文件在此程序文件夾下,可以看到文件已經(jīng)生成了。

文件讀寫函數(shù)

功能函數(shù)名適用于
字符輸入函數(shù)fgetc所有輸入流
字符輸出函數(shù)fputc所有輸出流
文本行輸入函數(shù)fgets所有輸入流
文本行輸出函數(shù)fputs所有輸出流
格式化輸入函數(shù)fscanf所有輸入流
格式化輸出函數(shù)fprintf所有輸出流
二進(jìn)制輸入fread文件
二進(jìn)制輸出fwrite文件

二進(jìn)制方式存儲(chǔ)文件

二進(jìn)制存儲(chǔ)在文件內(nèi)是查看不到具體信息的,要想在文件內(nèi)查看具體信息要選擇其他函數(shù)。

二進(jìn)制形式存儲(chǔ)代碼示例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <malloc.h>

struct student
{
    char name[20];
    int age;
    char adress[20];
}*s1;
int main()
{
    s1 = (struct student*)malloc(sizeof(struct student));
    if (s1 == NULL)
    {
        perror("malloc:");
        return 0;
    }
    FILE* pf = fopen("test.txt", "wb");
    if (pf == NULL)
    {
        perror("FOPEN:");   //對(duì)文件指針進(jìn)行判斷以免返回空指針;
        return 0;
    }
    strcpy(s1->name, "陳獨(dú)秀");
    s1->age = 18;
    strcpy(s1->adress,"東城區(qū)箭桿胡同20號(hào)");
    fwrite(s1, sizeof(struct student), 1, pf);
    fclose(pf);
    pf = NULL;
}

結(jié)果:

C語言怎么實(shí)現(xiàn)對(duì)文件進(jìn)行操作

可以看到文件已經(jīng)出現(xiàn)了部分亂碼,還能看到文字的原因是文本文件打開的時(shí)候默認(rèn)以一種編碼形式打開,將本來存到文本里的二進(jìn)制信息進(jìn)行了解碼。

對(duì)文件進(jìn)行拷貝

這里要注意\需要再用\轉(zhuǎn)義,否則是轉(zhuǎn)義字符的意思

  • 先打開要拷貝的文件,再打開新建拷貝后的文件進(jìn)行拷貝

  • 如果是圖片視頻等文件,要使用二進(jìn)制的方式打開、讀取和存儲(chǔ),否則文件會(huì)損壞

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main()
{
    FILE* pfr = fopen("C:\\Users\\22763\\Pictures\\Saved Pictures\\QQ圖片20211001085735.jpg", "rb"); 		//要拷貝的文件目錄
    FILE* pfw = fopen("CopyPic.jpg", "wb");
    char temp;
    if (pfw == NULL||pfr==NULL)
    {
        perror("FOPEN:");   //對(duì)文件指針進(jìn)行判斷以免返回空指針;
        return 0;
    }
    while (fread(&temp, sizeof(char), 1, pfr))
    {
        fwrite(&temp, sizeof(char), 1, pfw);
    }
    fclose(pfw);
    fclose(pfr);
    pfw = NULL;
    pfr = NULL;
}

文件隨機(jī)讀寫函數(shù)

這三個(gè)函數(shù)并不常用,所有只要知道有這三個(gè)函數(shù)就行了以及他們是干什么的就可以了,用的時(shí)候再查。

fseek

int fseek(FILE stream,long offset,int origin );

根據(jù)文件指針的位置和偏移量來定位文件指針。

ftell

long ftell( FILE *stream );

返回文件指針相對(duì)于起始位置的偏移量

rewind

void rewind( FILE *stream );

讓文件指針的位置回到文件的起始位置

文件緩沖區(qū)

文件在讀或者寫的時(shí)候存在一個(gè)文件緩沖區(qū),因?yàn)榕c磁盤交互,需要一定時(shí)間(盡管很短),但是為了盡可能的節(jié)省時(shí)間,系統(tǒng)自動(dòng)地在內(nèi)存中設(shè)立了文件緩沖區(qū),等攢夠一定的數(shù)據(jù),或者程序結(jié)束,一起讀或?qū)?,這樣大大提高讀寫速度,避免每個(gè)字符都要進(jìn)行一次讀或?qū)憽?/p>

以上就是關(guān)于“C語言怎么實(shí)現(xiàn)對(duì)文件進(jìn)行操作”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI