網(wǎng)站首頁 編程語言 正文
1.為什么使用文件
大家在寫程序的時候有沒有一個困惑,就是我寫的程序,輸入一些數(shù)據(jù)后,當(dāng)我把程序關(guān)掉以后數(shù)據(jù)就消失了。這是因為程序運行時,所有的數(shù)據(jù)都存儲在內(nèi)存中,當(dāng)程序退出后,程序中的數(shù)據(jù)自然就不存在了。等下次再運行程序時,又要重新錄入數(shù)據(jù),非常難受
? 如何解決這個問題呢,我們可以學(xué)習(xí)使用文件來將其保存
2.什么是文件
2.1文件分類
在程序設(shè)計中,一般將文件分為兩部分:程序文件和數(shù)據(jù)文件
程序文件:
包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境后綴為.exe)。
數(shù)據(jù)文件:
文件的內(nèi)容不一定是程序,而是程序運行時讀寫的數(shù)據(jù),比如程序運行需要從中讀取數(shù)據(jù)的文件或者輸出內(nèi)容的文件
這次我們想要聊的是第二種數(shù)據(jù)文件,它可以幫助將我們運行時的數(shù)據(jù)存儲到磁盤中,以便我們下次使用
2.2 文件名
每一個文件都有自己的名字,它由三部分組成
文件路徑+文件名主干+文件后綴
c:\code\test.txt
3.文件的打開和關(guān)閉
3.1文件指針
想要打開一個文件,我們需要使用到文件指針,該指針是由系統(tǒng)聲明的,例如,VS2013編譯環(huán)境提供的 stdio.h 頭文件中有以下的文件類型申明
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
相信很多人看到這里,已經(jīng)不想再讀下去了,堅持一下,前面這些并不重要
3.2 如何使用文件指針
首先我們需要定義一個文件指針
FILE* pf
想要將數(shù)據(jù)存儲到文件中或者從文件中讀取數(shù)據(jù),我們先要將文件打開,ANSIC 規(guī)定使用fopen函數(shù)來打開文件。
FILE * fopen ( const char * filename, const char * mode );
filename: 文件名
mode : 文件的打開方式
下面是一些常見的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+”(讀寫) | 打開一個二進制文件,在文件尾進行讀和寫 | 建立一個新的文件 |
注:這里的輸入是指將數(shù)據(jù)寫到內(nèi)存中,輸出是寫到文件中
3.讀寫數(shù)據(jù)后使用fclose關(guān)閉文件。
int fclose ( FILE * stream );
// 示例
#include <stdio.h>
int main ()
{
FILE * pFile;
//打開文件
pFile = fopen ("myfile.txt","w");
//文件操作
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
//關(guān)閉文件
fclose (pFile);
}
return 0;
}
4.文件的讀寫
現(xiàn)在我們知道了,如何去打開一個文件,那么如何將它的數(shù)據(jù)輸入到程序中呢?
首先我想介紹一些函數(shù)
功能 | 函數(shù)名 | 適用于 |
---|---|---|
字符輸入函數(shù) | fgetc | 所有輸入流 |
字符輸出函數(shù) | fputc | 所有輸出流 |
文本行輸入函數(shù) | fgets | 所有輸入流 |
文本行輸出函數(shù) | fputs | 所有輸出流 |
格式化輸入函數(shù) | fscanf | 所有輸入流 |
格式化輸出函數(shù) | fprintf | 所有輸出流 |
二進制輸入 | fread | 文件 |
二進制輸出 | fwrite | 文件 |
看不懂? 沒關(guān)系,接下來我將用一個示例告訴你如何使用。
//這是我以前寫通信錄時用到的一些方法
typedef struct Contact
{
struct contact_person* data;
int count; //通訊錄中人員個數(shù)
int capacity;
}Contact;//通訊錄類型的指針
void Save(Contact* con) //將數(shù)據(jù)存儲到文件中
{
FILE* fp = fopen("contact.txt", "wb");
if (fp == NULL)
{
printf("Save()::%s", strerror(errno)); //如果打開失敗,報錯
return;
}
else
{
fwrite(con->data, sizeof(struct contact_person), con->count, fp);//將數(shù)據(jù)寫到contect.txt中
}
fclose(fp); //關(guān)閉文件
fp = NULL;
}
void Load(Contact* con) //將文件中的數(shù)據(jù)加載到內(nèi)存中
{
FILE* fp = fopen("contact.txt", "r");
if (fp == NULL)
{
printf("Load()::%s", strerror(errno));
return;
}
else
{
struct contact_person tmp;
while (fread(&tmp, sizeof(struct contact_person), 1, fp))// fread的返回值為讀到數(shù)據(jù)的個數(shù),用來判斷是否繼續(xù)讀取
{
Check_capacity(con);//檢測通訊錄容量是否足夠
con->data[con->count] = tmp;
con->count++;
}
}
fclose(fp);
fp = NULL;
}
原文鏈接:https://blog.csdn.net/m0_60447315/article/details/123565227
相關(guān)推薦
- 2023-11-17 Linux CentOS如何修改root用戶密碼
- 2023-05-30 python?snap7讀寫PLC的操作方法_python
- 2022-08-13 404究竟是什么意思呢?像404,200,503等數(shù)字究竟是什么東西
- 2022-04-15 關(guān)于pyinstaller生成.exe程序報錯:缺少.ini文件的分析_python
- 2022-08-15 Android?Gradle模塊依賴替換使用技巧_Android
- 2022-02-20 Unity3D實現(xiàn)經(jīng)典小游戲Pacman_C 語言
- 2022-09-01 C#通過System.CommandLine快速生成支持命令行的應(yīng)用程序_C#教程
- 2022-12-22 Go語言學(xué)習(xí)之接口使用的示例詳解_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支