亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言基礎(chǔ)文件操作方式超全詳解建議收藏

 更新時(shí)間:2021年10月13日 16:44:10   作者:Bitdancing  
這篇文章主要為大家介紹了關(guān)于C語(yǔ)言文件操作方式的詳細(xì)總結(jié),建議收藏隨用隨看,有需要的朋友可以借鑒參考下,希望能夠有所幫助

什么是文件

磁盤上的文件是文件。

在程序設(shè)計(jì)中,我們一般讀的文件有兩種:程序文件 和 數(shù)據(jù)文件

程序文件包括源程序文件(后綴為.c)、目標(biāo)文件(win下后綴為 .obj)、可執(zhí)行文件(win下環(huán)境后綴為.exe)

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

文件名

一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),以便于用戶識(shí)別與引用。

文件名包含3部分:文件路徑+文件名主干+文件后綴

c:\code\test.txt

文件類型

文本文件:肉眼看得懂的東西

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

如果要求在外存上以ASCII碼的形式存儲(chǔ),則需要在存儲(chǔ)前轉(zhuǎn)換,以ASCII字符(對(duì)應(yīng)ASCII的值)的形式存儲(chǔ)的文件就是文本文件。

文件指針

文件類型指針(文件指針)

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

vs2019編譯環(huán)境中提供的 stdio.h頭文件中有以下的文件類型聲明。

#ifndef _FILE_DEFINED
    #define _FILE_DEFINED
    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;
#endif

不同C編譯器的FILE類型包含內(nèi)容大同小異。

每當(dāng)打開一個(gè)文件的時(shí)候,系統(tǒng)會(huì)根據(jù)文件的情況自動(dòng)創(chuàng)建一個(gè)FILE結(jié)構(gòu)的變量,并填充其中的信息,使用者不必關(guān)心細(xì)節(jié)。

一般都是通過(guò)FILE的指針來(lái)維護(hù)這個(gè)FILE結(jié)構(gòu)的變量。

FILE *pf;

定義pf是一個(gè)指向FILE類型數(shù)據(jù)的指針變量,可以使pf指向某個(gè)文件的文件信息區(qū)(是一個(gè)結(jié)構(gòu)體變量)。通過(guò)該文件信息區(qū)中的信息就能夠訪問(wèn)該文件。也就是說(shuō),通過(guò)文件指針變量可以找到與他關(guān)聯(lián)的相關(guān)文件。

總結(jié):每個(gè)被使用的文件都在內(nèi)存中開辟一個(gè)相應(yīng)的文件信息區(qū),用來(lái)存放文件的相關(guān)信息,這個(gè)相關(guān)信息是個(gè)結(jié)構(gòu)體,使用typedef類型重新定義,也就是FILE。

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

在打開文件的同時(shí),會(huì)返回一個(gè)FILE*的指針變量指向該文件,也相當(dāng)于建立了指針和文件的關(guān)系。

ANSIC規(guī)定使用fopen來(lái)打開文件,fclose來(lái)關(guān)閉文件。

相對(duì)路徑寫法(當(dāng)前代碼所在路徑下)

… 表示上一級(jí)路徑

. 表示當(dāng)前路徑

FILE* p = fopen("../test.txt","r");    //打開當(dāng)前路徑低下 的test文件

絕對(duì)路徑寫法(明確指出)

fopen("C:\\2012_code\\84\\test\\test1.txt ","r");

打開方式

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

如果文件打開失敗,返回空指針NULL

在這里插入圖片描述

FILE* pf = fopen("text.txt","r");
if(pf == NULL)
{
    printf("%s\n",strerror(errno));
    return 0;
}
fclose(pf);
pf = NULL;

關(guān)閉文件時(shí)是值傳遞,不會(huì)改變文件本身。

文件的順序讀寫

結(jié)合MSDN食用更好

功能 函數(shù)名 適用于
字符輸入函數(shù) int fgetc( FILE * stream); 所有輸入流
字符輸出函數(shù) int fputc(int c, FILE* stream); 所有輸出流
文本行輸入函數(shù) char *fgets(char* string, int n, FILE* stream) 所有輸入流
文本行輸出函數(shù) int fputs(const char* string, FILE* stream) 所有輸出流
格式化輸入函數(shù) fscanf把文件假想成黑色的對(duì)話框。和普通的scanf相比,前面多了一個(gè)指向文件信息的指針。 所有輸入流
格式化輸出函數(shù) fprintf 和普通的printf相比,前面多了一個(gè)指向文件信息的指針。(把數(shù)據(jù)放到文件里了) 所有輸出流
二進(jìn)制輸入 fread : 返回類型是讀了幾個(gè)元素 文件
二進(jìn)制輸出 fwrite 文件

鍵盤stdin和屏幕stdout都是外部設(shè)備, stdin和stdout都是FILE類型的

鍵盤stdin和屏幕stdout都是外部設(shè)備, stdinstdout都是FILE類型的

鍵盤 - 標(biāo)準(zhǔn)輸入設(shè)備; 屏幕 - 標(biāo)準(zhǔn)輸出設(shè)備

是一個(gè)程序默認(rèn)打開的兩個(gè)流設(shè)備。

關(guān)于fread的返回值

fread returns the number of full items actually read, 
which may be less than count if an error occurs or if the end of the file is encountered before reaching count.
Use the feof or ferror function to distinguish a read error from an end-of-file condition.
If size or count is 0,
fread returns 0 and the buffer contents are unchanged.

對(duì)比一組函數(shù)

scanfprintf:針對(duì)標(biāo)準(zhǔn)輸入流、標(biāo)準(zhǔn)輸出流的格式化輸入、輸出語(yǔ)句

fscanffprintf:針對(duì)所有輸入流、所有輸出流的格式化輸入、輸出語(yǔ)句

sscanfsprintf:

sscanf :從字符串中讀取格式化的數(shù)據(jù)

Read formatted data from a string.

int sscanf( const char *buffer, const char *format [, argument ] ... );

sprintf:把格式化的數(shù)據(jù)存儲(chǔ)到字符串中

Write formatted data to a string.

int sprintf( char *buffer, const char *format [, argument] ... );

用途:記錄日志

但是文件不安全,不夠高效 ------>>>> 數(shù)據(jù)庫(kù) MySQL ?

使用文件的格式:

打開文件 — 安全檢查 ---- 操作 ---- 關(guān)閉文件

文件隨機(jī)讀取

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

fseek
Moves the file pointer to a specified location.
int fseek( FILE *stream, long offset, int origin );
offset: 偏移量(單位字節(jié))   origin:文件指針當(dāng)前位置

文件當(dāng)前位置的三種形式:

SEEK_CUR
Current position of file pointer

SEEK_END
End of file

SEEK_SET
Beginning of file

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

ftell  
Gets the current position of a file pointer.
long ftell( FILE *stream );

應(yīng)用

int main()
{
    FILE* pf = fopen("test.txt","r");
    if(pf == NULL)
    {
		printf("%s\n",strerror(errno));
    }
    //1.定位文件指針
    fseek(pf, 2, SEEK_CUR);
    //2.讀取文件
    int ch = fgetc(pf);
    
    printf("%c",ch);
    
    fclose(pf);
    pf=NULL;
	return 0;
}

rewind:讓文件指針回到起始位置

rewind  
Repositions the file pointer to the beginning of a file.
void rewind( FILE *stream );

文件結(jié)束判斷

在文件讀取過(guò)程中,不能用feof函數(shù)的返回值直接用來(lái)判斷文件是否結(jié)束。

Return Value

The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.

而是應(yīng)用于當(dāng)文件讀取結(jié)束的時(shí)候,判斷是讀取失敗結(jié)束,還是遇到文件尾結(jié)束。

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

​ fgetc判斷是否是EOFfgets判斷返回值是否為NULL。

2.二進(jìn)制文件的讀取結(jié)束判斷,判斷返回值是否小于實(shí)際要讀的個(gè)數(shù)。比如:通過(guò)fread判斷返回值是否小于實(shí)際要讀的個(gè)數(shù)。

perror()

函數(shù)直接先打印你放在括號(hào)里面的字符串,然后接著打印冒號(hào)和錯(cuò)誤信息。

ferror()

Return Value

If no error has occurred on stream, ferror returns 0. Otherwise, it returns a nonzero value.

應(yīng)用

int main()
{
	FILE* pf = fopen("test.txt","r");
    if(pf == NULL)
    {
        perror("open file test2.txt");
        return 0;
    }
    //讀文件
    int ch = 0;
    while((ch = fgetc(pf)) != EOF)
    {
		putc(ch);
    }
    if(ferror(pf))
    {
		printf("error\n");
    }
    else if(feof(of))
    {
		printf("end of file");
    }
	return 0;
}

以上就是C語(yǔ)言文件操作方式超全詳解建議收藏的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言文件操作方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言詳細(xì)分析講解struct與union使用方法

    C語(yǔ)言詳細(xì)分析講解struct與union使用方法

    最近開始自學(xué)C語(yǔ)言,從最基礎(chǔ)部分的開始學(xué)起。今天看書的時(shí)候注意到了struct和union似乎很像,除了名字不同,看起來(lái)幾乎沒有區(qū)別。<BR>既然C中定義了struct和union兩個(gè)關(guān)鍵字,那么它們肯定是有區(qū)別的,在查了一些資料之后我來(lái)總結(jié)一下他們的使用
    2022-04-04
  • 基于c++ ege圖形庫(kù)實(shí)現(xiàn)五子棋游戲

    基于c++ ege圖形庫(kù)實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了基于c++ ege圖形庫(kù)實(shí)現(xiàn)五子棋游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++深入刨析優(yōu)先級(jí)隊(duì)列priority_queue的使用

    C++深入刨析優(yōu)先級(jí)隊(duì)列priority_queue的使用

    最近我學(xué)習(xí)了C++中的STL庫(kù)中的優(yōu)先級(jí)隊(duì)列(priority_queue)容器適配器,對(duì)于優(yōu)先級(jí)隊(duì)列,我們不僅要會(huì)使用常用的函數(shù)接口,我們還有明白這些接口在其底層是如何實(shí)現(xiàn)的
    2022-08-08
  • C++ 利用硬件加速矩陣乘法的實(shí)現(xiàn)

    C++ 利用硬件加速矩陣乘法的實(shí)現(xiàn)

    這篇文章主要介紹了C++ 利用硬件加速矩陣乘法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C語(yǔ)言中循環(huán)語(yǔ)句練習(xí)實(shí)例

    C語(yǔ)言中循環(huán)語(yǔ)句練習(xí)實(shí)例

    大家好,本篇文章主要講的是C語(yǔ)言中循環(huán)語(yǔ)句練習(xí)實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C語(yǔ)言基礎(chǔ)使用IDE快速開發(fā)的方法

    C語(yǔ)言基礎(chǔ)使用IDE快速開發(fā)的方法

    這篇文章主要介紹了C語(yǔ)言基礎(chǔ)使用IDE快速開發(fā)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲

    基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • QT使用canon sdk拍照并保存到本機(jī)的方法示例

    QT使用canon sdk拍照并保存到本機(jī)的方法示例

    這篇文章主要介紹了QT使用canon sdk拍照并保存到本機(jī)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C++ 私有析構(gòu)函數(shù)的作用示例詳解

    C++ 私有析構(gòu)函數(shù)的作用示例詳解

    這篇文章主要介紹了C++ 私有析構(gòu)函數(shù)的作用,私有析構(gòu)函數(shù)不會(huì)影響棧上對(duì)象的自動(dòng)析構(gòu),它們會(huì)在其作用域結(jié)束時(shí)自動(dòng)調(diào)用析構(gòu)函數(shù)。私有析構(gòu)函數(shù)主要影響的是對(duì)堆上對(duì)象的顯式刪除操作,需要的朋友可以參考下
    2023-06-06
  • C++實(shí)現(xiàn)學(xué)生管理系統(tǒng)示例解析

    C++實(shí)現(xiàn)學(xué)生管理系統(tǒng)示例解析

    這篇文章主要介紹了C++實(shí)現(xiàn)學(xué)生管理系統(tǒng)示例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論