前言
- 文件操作
在運行程序的時候,此時數(shù)據(jù)是存放在內(nèi)存中,當(dāng)程序退出的時候,程序中的數(shù)據(jù)自然就不存在了,等下次運行程序的時候,數(shù)據(jù)又得重新錄入,我們可以用文件的辦法,把程序中的數(shù)據(jù)保存下來,只有我們自己選擇刪除數(shù)據(jù)的時候,數(shù)據(jù)才不復(fù)存在。 這就涉及到了數(shù)據(jù)持久化的問題,我們一般數(shù)據(jù)持久化的方法有,把數(shù)據(jù)存放在磁盤文件、存放到數(shù)據(jù)庫等方式。
文件指針:
向文件里輸出或讀取數(shù)據(jù)需要使用文件指針的形式,每個文件指針可以用來打開一個文件,這個文件指針指向文件的文件信息區(qū)。
FILE * 變量名 ??
文件的打開和關(guān)閉:
文件使用完之后要記得關(guān)閉,不讓會占用資源,文件關(guān)閉掉之后要記得把指針置空以免出現(xiàn)野指針
//打開文件
FILE * fopen ( const char * filename, const char * mode );
//關(guān)閉文件
int fclose ( FILE * stream );
文件的打開方式
文件使用方式 | 文件使用方式 | 如果指定文件不存在 |
---|---|---|
“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+”(讀寫) | 打開一個二進制文件,在文件尾進行讀和寫 | 建立一個新的文件 |
代碼示例
#include <stdio.h>
int main()
{
FILE *pf = fopen("test.txt",'w');
if(pf==NULL)
{
perror("FOPEN:"); //對文件指針進行判斷以免返回空指針;
}
fput("haohaoxuexi,tiantianxiangshang",pf);
fclose(pf);
pf=NULL; //文件關(guān)閉之后把指針置為空,以免出現(xiàn)野指針
}
‘ w ’ 沒有文件的情況下會新建一個文件在此程序文件夾下,可以看到文件已經(jīng)生成了。
在這里插入圖片描述
文件讀寫函數(shù)
功能 | 函數(shù)名 | 適用于 |
---|---|---|
字符輸入函數(shù) | fgetc | 所有輸入流 |
字符輸出函數(shù) | fputc | 所有輸出流 |
文本行輸入函數(shù) | fgets | 所有輸入流 |
文本行輸出函數(shù) | fputs | 所有輸出流 |
格式化輸入函數(shù) | fscanf | 所有輸入流 |
格式化輸出函數(shù) | fprintf | 所有輸出流 |
二進制輸入 | fread | 文件 |
二進制輸出 | fwrite | 文件 |
二進制方式存儲文件
二進制存儲在文件內(nèi)是查看不到具體信息的,要想在文件內(nèi)查看具體信息要選擇其他函數(shù)。
二進制形式存儲代碼示例
#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:"); //對文件指針進行判斷以免返回空指針;
return 0;
}
strcpy(s1->name, "陳獨秀");
s1->age = 18;
strcpy(s1->adress,"東城區(qū)箭桿胡同20號");
fwrite(s1, sizeof(struct student), 1, pf);
fclose(pf);
pf = NULL;
}
結(jié)果:
可以看到文件已經(jīng)出現(xiàn)了部分亂碼,還能看到文字的原因是文本文件打開的時候默認以一種編碼形式打開,將本來存到文本里的二進制信息進行了解碼。
對文件進行拷貝
這里要注意\需要再用\轉(zhuǎn)義,否則是轉(zhuǎn)義字符的意思
- 先打開要拷貝的文件,再打開新建拷貝后的文件進行拷貝
- 如果是圖片視頻等文件,要使用二進制的方式打開、讀取和存儲,否則文件會損壞
#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:"); //對文件指針進行判斷以免返回空指針;
return 0;
}
while (fread(&temp, sizeof(char), 1, pfr))
{
fwrite(&temp, sizeof(char), 1, pfw);
}
fclose(pfw);
fclose(pfr);
pfw = NULL;
pfr = NULL;
}
文件隨機讀寫函數(shù)
- 這三個函數(shù)并不常用,所有只要知道有這三個函數(shù)就行了以及他們是干什么的就可以了,用的時候再查。
fseek
int fseek(FILE stream,long offset,int origin );
根據(jù)文件指針的位置和偏移量來定位文件指針。
ftell
long ftell( FILE *stream );
返回文件指針相對于起始位置的偏移量
rewind
void rewind( FILE *stream );
讓文件指針的位置回到文件的起始位置
文件緩沖區(qū)
文件在讀或者寫的時候存在一個文件緩沖區(qū),因為與磁盤交互,需要一定時間(盡管很短),但是為了盡可能的節(jié)省時間,系統(tǒng)自動地在內(nèi)存中設(shè)立了文件緩沖區(qū),等攢夠一定的數(shù)據(jù),或者程序結(jié)束,一起讀或?qū)?,這樣大大提高讀寫速度,避免每個字符都要進行一次讀或?qū)憽?/p>
刪除線格式文章來源:http://www.zghlxwxcb.cn/news/detail-411860.html
撒花
這就是文件操作的全部內(nèi)容了,創(chuàng)作不易,還請各位小伙伴多多點贊??關(guān)注收藏?,以后也會更新各種小游戲還有關(guān)于c語言的博客,撒花!文章來源地址http://www.zghlxwxcb.cn/news/detail-411860.html
到了這里,關(guān)于如何使用 “C語言” 對文件進行操作?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!