C語言基礎文件操作方式超全詳解建議收藏

什麼是文件

磁盤上的文件是文件。

在程序設計中,我們一般讀的文件有兩種:程序文件 和 數據文件

程序文件包括源程序文件(後綴為.c)、目標文件(win下後綴為 .obj)、可執行文件(win下環境後綴為.exe)

數據文件:文件的內容不一定是程序,而是運行時讀寫的程序,比如程序運行需要從中讀取數據的文件,或者輸出內容的文件。

文件名

一個文件要有一個唯一的文件標識,以便於用戶識別與引用。

文件名包含3部分:文件路徑+文件名主幹+文件後綴

c:\code\test.txt

文件類型

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

二進制文件:數據在內存中中以二進制形式存儲,如果不加轉換的輸出到外存,就是二進制文件。

如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉換,以ASCII字符(對應ASCII的值)的形式存儲的文件就是文本文件。

文件指針

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

每個被使用的文件都在內存中開辟一個相應的文件信息區,用來存放文件的相關信息(如文件名字,文件狀態,文件當前的位置)。這些信息是保存在一個結構體變量中的。該結構體類型是有系統聲明的,取名為FILE.

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

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

不同C編譯器的FILE類型包含內容大同小異。

每當打開一個文件的時候,系統會根據文件的情況自動創建一個FILE結構的變量,並填充其中的信息,使用者不必關心細節。

一般都是通過FILE的指針來維護這個FILE結構的變量。

FILE *pf;

定義pf是一個指向FILE類型數據的指針變量,可以使pf指向某個文件的文件信息區(是一個結構體變量)。通過該文件信息區中的信息就能夠訪問該文件。也就是說,通過文件指針變量可以找到與他關聯的相關文件。

總結:每個被使用的文件都在內存中開辟一個相應的文件信息區,用來存放文件的相關信息,這個相關信息是個結構體,使用typedef類型重新定義,也就是FILE

文件的打開與關閉

在打開文件的同時,會返回一個FILE*的指針變量指向該文件,也相當於建立瞭指針和文件的關系。

ANSIC規定使用fopen來打開文件,fclose來關閉文件。

相對路徑寫法(當前代碼所在路徑下)

… 表示上一級路徑

. 表示當前路徑

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

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

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

打開方式

文件使用方式 含義 如果指定文件不存在
“r”(隻讀) 為瞭輸入數據,打開一個已存在的文本文件 出錯
“w”(隻寫) 為瞭輸出數據,打開一個文本文件 建立一個新的文件(銷毀原來的文件信息)
“a”(追加) 向文本文件尾添加數據 出錯
“rb”(隻讀) 為瞭輸入數據,打開一個二進制文件 出錯
“wb”(隻寫) 為瞭輸出數據,打開一個二進制文件 建立一個新的文件(銷毀原來的文件信息)
“ab”(追加) 向一個二進制文件添加數據 出錯
“r+”(讀寫) 為瞭讀和寫,打開一個文本文件 出錯
“w+”(讀寫) 為瞭讀和寫,建立一個新的文件 建立一個新的文件
“a+”(讀寫) 打開一個文件,在文件尾進行讀寫 建立一個新的文件

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

在這裡插入圖片描述

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

關閉文件時是值傳遞,不會改變文件本身。

文件的順序讀寫

結合MSDN食用更好

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

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

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

鍵盤 – 標準輸入設備; 屏幕 – 標準輸出設備

是一個程序默認打開的兩個流設備。

關於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.

對比一組函數

scanfprintf:針對標準輸入流、標準輸出流的格式化輸入、輸出語句

fscanffprintf:針對所有輸入流、所有輸出流的格式化輸入、輸出語句

sscanfsprintf:

sscanf :從字符串中讀取格式化的數據

Read formatted data from a string.

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

sprintf:把格式化的數據存儲到字符串中

Write formatted data to a string.

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

用途:記錄日志

但是文件不安全,不夠高效 ——>>>> 數據庫 MySQL ?

使用文件的格式:

打開文件 — 安全檢查 —- 操作 —- 關閉文件

文件隨機讀取

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

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

文件當前位置的三種形式:

SEEK_CUR
Current position of file pointer

SEEK_END
End of file

SEEK_SET
Beginning of file

ftell返回文件指針相對於起始位置的偏移量。

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

應用

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 );

文件結束判斷

在文件讀取過程中,不能用feof函數的返回值直接用來判斷文件是否結束。

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.

而是應用於當文件讀取結束的時候,判斷是讀取失敗結束,還是遇到文件尾結束。

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

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

2.二進制文件的讀取結束判斷,判斷返回值是否小於實際要讀的個數。比如:通過fread判斷返回值是否小於實際要讀的個數。

perror()

函數直接先打印你放在括號裡面的字符串,然後接著打印冒號和錯誤信息。

ferror()

Return Value

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

應用

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語言文件操作方式超全詳解建議收藏的詳細內容,更多關於C語言文件操作方式的資料請關註WalkonNet其它相關文章!

推薦閱讀: