一文搞懂C語言中的文件操作
一、文件操作
1、 為什要使用文件操作
在c語言中我們完成一個(gè)程序后,他并不會(huì)對(duì)我們的數(shù)據(jù)進(jìn)行保存,就像我上一篇文章中實(shí)現(xiàn)一個(gè)通訊錄人員的增刪插改中數(shù)據(jù)只是短暫的保存,而當(dāng)程序退出后的同時(shí)人員信息也就銷毀了,在此執(zhí)行程序的時(shí)候人員信息并沒有保存,而這是為什呢?是因?yàn)槲覀儓?zhí)行程序時(shí)我們寫的代碼信息數(shù)據(jù)不是持久化的,而要讓他持久化就要用到文件操作,將我們寫的數(shù)據(jù)存到文件中,而文件信息是存放到硬盤當(dāng)中的,這樣就達(dá)到了信息的持久化,也就在此使用時(shí)信息還是進(jìn)行了一個(gè)保存。
2、什么是文件
2.1概念
存放在磁盤的文件就是文件。文件分為兩種:數(shù)據(jù)文件,程序文件。
2.1.1程序文件:
包括源程序文件(后綴為.c),目標(biāo)文件(windows環(huán)境后綴為.obj),可執(zhí)行程序(windows環(huán)境 后綴為.exe)。
2.1.2數(shù)據(jù)文件:
文件的內(nèi)容不一定是程序,而是程序運(yùn)行時(shí)讀寫的數(shù)據(jù),比如程序運(yùn)行需要從中讀取數(shù)據(jù)的文件, 或者輸出內(nèi)容的文件。
2.2文件名
一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí),以便用戶識(shí)別和引用。
文件名包含3部分:文件路徑+文件名主干+文件后綴
例如: c:\code\test.txt 為了方便起見,文件標(biāo)識(shí)常被稱為文件名。
3、文件操作的使用
3.1文件操作的打開和關(guān)閉
文件在讀寫之前應(yīng)該先打開文件,在使用結(jié)束之后應(yīng)該關(guān)閉文件。 在編寫程序的時(shí)候,在打開文件的同時(shí),都會(huì)返回一個(gè)FILE*的指針變量指向該文件,也相當(dāng)于建立了指 針和文件的關(guān)系。
ANSIC 規(guī)定使用fopen函數(shù)來打開文件,fclose來關(guān)閉文件。
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("Contact.txt","w"); //打開文件輸入文件地址,和打開方式
if(p==NULL) //如果傳入空指針則會(huì)報(bào)錯(cuò)
{
printf("%s", strerror(errno));
}
fclose(p); //關(guān)閉文件
p=NULL; //防止變?yōu)橐爸羔?
return 0;
}
3.2文件使用方式為

3.3文件的順序讀寫
3.3.1fputc:
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("Contact.txt","w");
if(p==NULL)
{
printf("%s", strerror(errno));
}
for(char i='a';i<'z';i++)
{
fputc(i,p); //像文件中寫入數(shù)據(jù),寫入的是單個(gè)字節(jié)
}
fclose(p);
p=NULL;
return 0;
}
3.3.2 fgetc:
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("Contact.txt","r");
if(p==NULL)
{
printf("%s", strerror(errno));
}
for(char i='a';i<'z';i++)
{
printf("%c ",fgetc(p)); //從文件中獲得數(shù)據(jù)打印出來
}
fclose(p);
p=NULL;
return 0;
}
3.3.3 fputs:
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("Contact.txt","w");//寫入文件數(shù)據(jù)用w,讀取數(shù)據(jù)用r
if(p==NULL)
{
printf("%s", strerror(errno));
}
fputs("hello world ",p); //向代碼中寫入字符串
fclose(p);
p=NULL;
return 0;
}
3.3.4fgets:
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("Contact.txt","r");//寫入文件數(shù)據(jù)用w,讀取數(shù)據(jù)用r
if(p==NULL)
{
printf("%s", strerror(errno));
}
char arr[20]={0};
fgets(arr,15,p);
printf("%s\n",arr);
fclose(p);
p=NULL;
return 0;
}
3.3.5fprintf:
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("Contact.txt","w");//寫入文件數(shù)據(jù)用w,讀取數(shù)據(jù)用r
if(p==NULL)
{
printf("%s", strerror(errno));
}
char arr[20]={"hello xiaoma"};
fprintf(p,"%s",arr);
fclose(p);
p=NULL;
return 0;
}
3.3.6fscanf:
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("Contact.txt","r");//寫入文件數(shù)據(jù)用w,讀取數(shù)據(jù)用r
if(p==NULL)
{
printf("%s", strerror(errno));
}
char arr[20]={0};
fscanf(p,"%s",arr);
printf("%s\n",arr);
fclose(p);
p=NULL;
return 0;
}
3.3.7fwrite:
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("Contact.txt","wb");//寫入文件數(shù)據(jù)用w,讀取數(shù)據(jù)用r wb是以二進(jìn)制的方式寫,rb是以二進(jìn)制的方式讀
if(p==NULL)
{
printf("%s", strerror(errno));
}
char arr[20]={"hello world"};
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
fwrite(arr+i,sizeof(arr[0]),1,p); //一次寫入一個(gè)元素,寫入類型為char型
}
fclose(p);
p=NULL;
return 0;
}
3.3.8fread:
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("Contact.txt","rb");//寫入文件數(shù)據(jù)用w,讀取數(shù)據(jù)用r wb是以二進(jìn)制的方式寫,rb是以二進(jìn)制的方式讀
if(p==NULL)
{
printf("%s", strerror(errno));
}
char arr[20]={0};
fread(arr,sizeof(arr),1,p);
printf("%s\n",arr);
fclose(p);
p=NULL;
return 0;
}
3.4文件的隨機(jī)讀寫
3.4.1fseek:
根據(jù)文件指針的位置和偏移量來定位文件指針
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("/Users/mamenghao/Desktop/Contact.txt","rb");//寫入文件數(shù)據(jù)用w,讀取數(shù)據(jù)用r wb是以二進(jìn)制的方式寫,rb是以二進(jìn)制的方式讀
if(p==NULL)
{
printf("%s", strerror(errno));
}
fseek(p,2,SEEK_SET); //SEEK_SET 偏移量從頭開始
// SEEK_CUR 偏移量從你上一次的位置開始
// SEEK_END //偏移量從尾開始
int ch =fgetc(p);
printf("%c ",ch);
fclose(p);
p=NULL;
return 0;
}
3.4.2ftell:
返回文件指針相對(duì)于起始位置的偏移量
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("/Users/mamenghao/Desktop/Contact.txt","rb");//寫入文件數(shù)據(jù)用w,讀取數(shù)據(jù)用r wb是以二進(jìn)制的方式寫,rb是以二進(jìn)制的方式讀
if(p==NULL)
{
printf("%s", strerror(errno));
}
fseek(p,2,SEEK_SET); //SEEK_SET 偏移量從頭開始
// SEEK_CUR 偏移量從你上一次的位置開始
// SEEK_END //偏移量從尾開始
printf("%ld\n",ftell(p)); //這就打印了當(dāng)前偏移量
int ch =fgetc(p);
printf("%c ",ch);
fclose(p);
p=NULL;
return 0;
}3.4.3rewind:
讓文件指針的位置回到文件起始位置
#include <stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE*p=fopen("/Users/mamenghao/Desktop/Contact.txt","rb");//寫入文件數(shù)據(jù)用w,讀取數(shù)據(jù)用r wb是以二進(jìn)制的方式寫,rb是以二進(jìn)制的方式讀
if(p==NULL)
{
printf("%s", strerror(errno));
}
fseek(p,2,SEEK_SET); //SEEK_SET 偏移量從頭開始
// SEEK_CUR 偏移量從你上一次的位置開始
// SEEK_END //偏移量從尾開始
printf("%ld\n",ftell(p)); //這就打印了當(dāng)前偏移量
rewind(p); //使偏移量回到了起始位置
printf("%ld\n",ftell(p)); //在次打印偏移量的位置來確定是否回到起始位置
int ch =fgetc(p);
printf("%c ",ch);
fclose(p);
p=NULL;
return 0;
}
總結(jié)
對(duì)于文件操作并不是特別難,主要是我們對(duì)于文件操作不習(xí)慣的原因,讓我們覺得文件操作很難,只要我么熟悉掌握fputc fgetc fputs fgets fprintf fscanf fwrite fread 這些函數(shù)的使用方法,文件操作也就容易理解啦,主要是在于操作,我們可以在下面把每一個(gè)都操作一下?。?!
到此這篇關(guān)于一文搞懂C語言中的文件操作的文章就介紹到這了,更多相關(guān)C語言文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析
這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件.下面我們寫一個(gè)簡單的可變參數(shù)的函數(shù),該函數(shù)至少有一個(gè)整數(shù)參數(shù),第二個(gè)參數(shù)也是整數(shù),是可選的.函數(shù)只是打印這兩個(gè)參數(shù)的值2013-09-09
C++ BloomFilter布隆過濾器應(yīng)用及概念詳解
布隆過濾器是由布隆(Burton Howard Bloom)在1970年提出的 一種緊湊型的、比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu),特點(diǎn)是高效地插入和查詢,可以用來告訴你 “某樣?xùn)|西一定不存在或者可能存在”,它是用多個(gè)哈希函數(shù),將一個(gè)數(shù)據(jù)映射到位圖結(jié)構(gòu)中2023-03-03
C++實(shí)現(xiàn)LeetCode(92.倒置鏈表之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(倒置鏈表之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

