C++中文件操作基礎(chǔ)詳解
文件操作
意義:利用文件操作可以保存我們程序運(yùn)行的信息,是持久化技術(shù)的體現(xiàn)
文件分類(lèi)
按文件類(lèi)型分為:
1、文本文件 - 文件以文本的ASCII碼形式存儲(chǔ)在計(jì)算機(jī)中
2、二進(jìn)制文件 - 文件以文本的二進(jìn)制形式存儲(chǔ)在計(jì)算機(jī)中
按類(lèi)分為:
- ofstream類(lèi):寫(xiě)操作
- ifstream類(lèi): 讀操作
- fstream類(lèi): 讀寫(xiě)操作
文本文件
寫(xiě)文件
五個(gè)步驟:
1.引入頭文件
#include <fstream>
2.創(chuàng)建流對(duì)象
ofstream 對(duì)象名;
3.打開(kāi)文件
對(duì)象名.open(“文件路徑”,打開(kāi)方式);
4.寫(xiě)數(shù)據(jù)
對(duì)象名 << “待寫(xiě)入的數(shù)據(jù)”;
5.關(guān)閉文件
對(duì)象名.close();
文件打開(kāi)方式:
| 打開(kāi)方式 | 用法 |
|---|---|
| ios::in | 為讀文件而打開(kāi)文件 |
| ios::out | 為寫(xiě)文件而打開(kāi)文件 |
| ios::ate | 初始位置:文件尾 |
| ios::app | 追加方式寫(xiě)文件 |
| ios::trunc | 如果文件存在先刪除,再創(chuàng)建 |
| ios::binary | 二進(jìn)制方式 |
注意: 文件打開(kāi)方式可以利用 | 操作符配合使用
例如:用二進(jìn)制方式寫(xiě)文件 ios::binary | ios:: out
代碼示例
#include<iostream>
#include<fstream>
using namespace std;
//寫(xiě)文件操作
void test()
{
ofstream file;
file.open("myFirstFile.txt", ios::out);
file << "姓名:葉落秋白" << endl;
file << "年齡:繁華的18歲" << endl;
file << "愛(ài)好:碼字" << endl;
file.close();
}
int main(void)
{
test();
return 0;
}
按照順序,先引入頭文件<fstream>,創(chuàng)建寫(xiě)文件類(lèi)對(duì)象file,然后就是調(diào)用open函數(shù)設(shè)置打開(kāi)方式為寫(xiě)文件并保存文件路徑為myFirstFile.txt,這里直接寫(xiě)文本文件名稱(chēng)的話(huà),該文件會(huì)自動(dòng)生成到該項(xiàng)目路徑下。接下來(lái)用左移運(yùn)算符寫(xiě)入內(nèi)容,這里文件也支持endl,可以自動(dòng)換行,最后調(diào)用close函數(shù)關(guān)閉保存文件。
運(yùn)行效果:


讀文件
讀文件與寫(xiě)文件步驟相似,但是讀取方式相對(duì)于比較多
讀文件步驟如下:
1.引入頭文件
#include <fstream>
2.創(chuàng)建流對(duì)象
ifstream 對(duì)象名;
3.打開(kāi)文件并判斷文件是否打開(kāi)成功
對(duì)象名.open(“文件路徑”,打開(kāi)方式);
4.讀數(shù)據(jù)
四種方式讀取
5.關(guān)閉文件
對(duì)象名.close();
代碼示例
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
//讀文件
void readFile()
{
ifstream file;
file.open("myFirstFile.txt",ios::in);
if (!file.is_open())
{
cout << "文件打開(kāi)失敗,請(qǐng)檢查文件路徑!"<<endl;
return;
}
//1、
char buffer[1024];
while (file >> buffer)
{
cout << buffer << endl;
}
//2、
char buffer[1024];
while (file.getline(buffer,sizeof(buffer)))
{
cout << buffer << endl;
}
//3、
string buffer;
while (getline(file, buffer))
{
cout << buffer << endl;
}
//4、
char c;
while ((c = file.get()) != EOF)
{
cout << c ;
}
file.close();
}
int main(void)
{
readFile();
return 0;
}
讀文件和寫(xiě)文件相比多用了一個(gè)判斷函數(shù)is_open,作用是成功打開(kāi)指定的文件會(huì)返回True。所以我加了個(gè)判斷語(yǔ)句,如果沒(méi)有打開(kāi)就提示然后return,結(jié)束讀文件操作。
后面就是讀文件的四種操作:
第一種操作是定義一個(gè)字符型的數(shù)組,利用右移運(yùn)算符將file對(duì)象的文件內(nèi)容加到該數(shù)組內(nèi),然后利用cout語(yǔ)句輸出。
第二種是調(diào)用成員函數(shù)getline,第一個(gè)形參是字符型數(shù)組地址,第二個(gè)參數(shù)是數(shù)組長(zhǎng)度,利用sizeof計(jì)算即可,然后輸出數(shù)組內(nèi)容。
第三種操作是利用字符串型,這時(shí)候要引入<string>頭文件。然后利用全局的getline函數(shù),第一個(gè)形參傳入對(duì)象名,第二個(gè)形參傳入字符串,然后打印字符串完成讀文件操作。
第四種不常用也不推薦使用,利用單個(gè)字符來(lái)獲取文件內(nèi)容,并打印,效率很低。file的get函數(shù)可以得到文件內(nèi)容,然后依次賦值給c。
最后讀文件結(jié)束記得加上調(diào)用close函數(shù)關(guān)閉文件。
運(yùn)行效果:

二進(jìn)制文件
以二進(jìn)制的方式對(duì)文件進(jìn)行讀寫(xiě)操作,打開(kāi)方式要指定為 ios::binary
可以存儲(chǔ)結(jié)構(gòu)體,對(duì)象成員等數(shù)據(jù)
寫(xiě)文件
二進(jìn)制方式寫(xiě)文件主要利用流對(duì)象來(lái)調(diào)用成員函數(shù)write
函數(shù)原型 :ostream& write(const char * buffer,int len);
參數(shù)解釋?zhuān)鹤址羔榖uffer指向內(nèi)存中一段存儲(chǔ)空間(常量指針)。len是讀寫(xiě)的字節(jié)數(shù)
代碼示例
#include <fstream>
#include <string>
using namespace std;
class Student
{
public:
char m_Name[32];
int m_Age;
};
//二進(jìn)制文件 寫(xiě)文件
void test01()
{
ofstream ofs;
ofs.open("student.txt", ios::out | ios::binary);
Student p = { "葉落秋白" , 18 };
//類(lèi)型強(qiáng)轉(zhuǎn)
ofs.write((const char*)&p, sizeof(p));
ofs.close();
}
int main(void)
{
test01();
return 0;
}
這里我準(zhǔn)備存儲(chǔ)學(xué)生類(lèi)的對(duì)象數(shù)據(jù),所以就簡(jiǎn)單的創(chuàng)建了一個(gè)學(xué)生類(lèi),里面含有年齡屬性和名字屬性。名字采用的是c語(yǔ)言的字符數(shù)組,最好不要用字符串,有時(shí)候會(huì)不兼容。類(lèi)創(chuàng)建完畢后,引入頭文件<fstream>,創(chuàng)建寫(xiě)文件類(lèi)對(duì)象ofs,指定打開(kāi)方式,利用"|"操作符配合使用打開(kāi)方式。接下來(lái)創(chuàng)建對(duì)象并為成員屬性賦值,然后就該通過(guò)調(diào)用write方法寫(xiě)文件內(nèi)容了,但是write的原型函數(shù)需要傳入的是字符型的常量指針,所以需要把對(duì)象p的地址強(qiáng)制轉(zhuǎn)換為(const char*),字節(jié)數(shù)利用sizeof計(jì)算。寫(xiě)文件內(nèi)容結(jié)束后要調(diào)用close函數(shù)關(guān)閉文件
運(yùn)行效果:

tips: 二進(jìn)制文件直接查看會(huì)出現(xiàn)亂碼的情況,但是只要我們能通過(guò)讀文件得到信息就沒(méi)有問(wèn)題
讀文件
二進(jìn)制方式讀文件主要利用流對(duì)象調(diào)用成員函數(shù)read
函數(shù)原型:istream& read(char *buffer,int len);
參數(shù)解釋?zhuān)鹤址羔榖uffer指向內(nèi)存中一段存儲(chǔ)空間(指針)。len是讀寫(xiě)的字節(jié)數(shù)
代碼示例
#include <fstream>
#include<iostream>
#include <string>
using namespace std;
class Student
{
public:
char m_Name[32];
int m_Age;
};
void test02()
{
//創(chuàng)建流對(duì)象和打開(kāi)方式可以一步到位,(調(diào)用內(nèi)部構(gòu)造函數(shù))
ifstream ifs("student.txt", ios::in | ios::binary);
if (!ifs.is_open())
{
cout << "文件打開(kāi)失敗" << endl;
}
Student p;
//類(lèi)型強(qiáng)轉(zhuǎn)
ifs.read((char*)&p, sizeof(p));
ifs.close();
cout << "學(xué)生姓名:" << p.m_Name << "\n學(xué)生年齡:" << p.m_Age << endl;
}
int main(void)
{
test02();
return 0;
}
二進(jìn)制讀文件和文本文件讀文件步驟幾乎一樣,也有判斷是否打開(kāi)成功的is_open函數(shù),最大的區(qū)別就是二進(jìn)制讀文件是調(diào)用的read函數(shù)。注意read函數(shù)原型的第一個(gè)形參是字符指針類(lèi)型,所以需要把學(xué)生對(duì)象的地址強(qiáng)制轉(zhuǎn)換一下。調(diào)用結(jié)束后就可以把文件的數(shù)據(jù)寫(xiě)給對(duì)象p的屬性,接下來(lái)調(diào)用close函數(shù)關(guān)閉文件再利用cout打印屬性即可。
運(yùn)行效果:

到此這篇關(guān)于C++中文件操作基礎(chǔ)詳解的文章就介紹到這了,更多相關(guān)C++文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC++簡(jiǎn)單實(shí)現(xiàn)關(guān)機(jī)、重啟計(jì)算機(jī)實(shí)例代碼
這篇文章主要介紹了VC++簡(jiǎn)單實(shí)現(xiàn)關(guān)機(jī)、重啟計(jì)算機(jī)實(shí)例代碼,很實(shí)用的功能,需要的朋友可以參考下2014-07-07
C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易掃雷
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易掃雷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
C語(yǔ)言實(shí)現(xiàn)搶紅包程序代碼精簡(jiǎn)版
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)搶紅包程序代碼的精簡(jiǎn)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Qt音視頻開(kāi)發(fā)之利用ffmpeg實(shí)現(xiàn)解碼本地?cái)z像頭
一開(kāi)始用ffmpeg做的是視頻流的解析,后面增加了本地視頻文件的支持,到后面發(fā)現(xiàn)ffmpeg也是支持本地?cái)z像頭設(shè)備的,所以本文就來(lái)用ffmpeg實(shí)現(xiàn)解碼本地?cái)z像頭功能吧2023-03-03
OpenCV利用霍夫變換進(jìn)行直線(xiàn)檢測(cè)
這篇文章主要為大家詳細(xì)介紹了OpenCV利用霍夫變換進(jìn)行直線(xiàn)檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
c++中string類(lèi)型和int類(lèi)型相互轉(zhuǎn)換的幾種常用方法
我們?cè)诰帉?xiě)程序時(shí),經(jīng)常涉及到int與string之間的類(lèi)型轉(zhuǎn)換,本文主要介紹了c++中string類(lèi)型和int類(lèi)型相互轉(zhuǎn)換的幾種常用方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
Matlab實(shí)現(xiàn)貪吃蛇小游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

