網(wǎng)站首頁 編程語言 正文
C++定義了I/O標(biāo)準(zhǔn)類庫(kù),這些每個(gè)類都稱為流/流類,用以完成某方面的功能
C++ 系統(tǒng)實(shí)現(xiàn)了一個(gè)龐大的類庫(kù),其中 ios 為基類,其他類都是直接或間接派生自 ios 類
1.標(biāo)準(zhǔn)輸出輸入流-控制臺(tái)流(iostream類)?
cin實(shí)際上是一個(gè)標(biāo)準(zhǔn)輸入流對(duì)象(類對(duì)象),常用的方式有,cin>>(cin.operator>>()), cin.get(), cin.getline()(用法:cin.getline(char s[], int nLength))
或者在std命名空間下,有一個(gè)單獨(dú)的getline()函數(shù),但是該函數(shù)時(shí)使用string對(duì)象作為參數(shù)的,即:getline(cin, str)
cout是標(biāo)準(zhǔn)輸出流對(duì)象(類對(duì)象),cout<<
cout cin printf scanf(格式化輸入輸出)比較
總結(jié):c++中盡量用cin和cout
//c_str()就是把string類對(duì)象轉(zhuǎn)換成和c兼容的char*類型。
//這是為了與c語言兼容,在c語言中沒有string類型
//故必須通過string類對(duì)象的成員函數(shù)c_str()把string 對(duì)象轉(zhuǎn)換成c中的字符串樣式
//例如
string a = "hellofjifj";
printf("%s\n", a.c_str());
//printf("%s\n", a);//這樣會(huì)有問題
2. 文件流(I/O操作)
在文件流中提供了三個(gè)派生類對(duì)文件數(shù)據(jù)進(jìn)行操作(注意這里是類,不像控制臺(tái)提供的是類對(duì)象)
- ofstream:輸出,即寫文件,由ostream引申而來
- ifstream:輸入,即讀取文件,由istream引申而來
- fstream :輸入輸出,同時(shí)讀寫操作,由iostream引申而來
文件的類型:文本文件 和 二進(jìn)制文件
文件讀寫的步驟:
- 包含的頭文件:#include <fstream>
- 創(chuàng)建流
- 打開文件(文件和流關(guān)聯(lián))
- 讀寫 (寫操作:<<,put( ),write( )讀操作:>> , get( ),getline( ), read( ))
- 關(guān)閉文件:把緩沖區(qū)數(shù)據(jù)完整地寫入文件, 添加文件結(jié)束標(biāo)志, 切斷流對(duì)象和外部文件的連接
文本文件
使用<< >> 進(jìn)行讀寫
<< 能實(shí)現(xiàn)以行為單位寫入文件
>> 不能一行為單位讀入內(nèi)存,而是以單詞為單位。總是以空格、Tab、回車結(jié)束
ofstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯(cuò)誤!"<<endl;
exit(0);
}
OpenFile << "abc def ghi";//把內(nèi)容寫入file文件
OpenFile.close();
const int len=20;
char str[len];
ifstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯(cuò)誤!"<<endl;
exit(0);
}
OpenFile >> str;
cout << str << endl;
OpenFile.close(); //str的內(nèi)容為abc,而不是abc def ghi(見空格停止)
getline()讀取一行
getline():以行為單位讀入內(nèi)存,能一次讀入一行
函數(shù)原型:istream &getline( char *buffer, streamsize num );
getline( )函數(shù)用于從文件讀取num個(gè)字符到buffer(內(nèi)存)中,直到下列情況發(fā)生時(shí),讀取結(jié)束:
- num個(gè)字符已經(jīng)讀入
- 碰到一個(gè)換行標(biāo)志
- 碰到一個(gè)EOF
const int len=20;
char str[len];
ifstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯(cuò)誤!"<<endl;
exit(0);
}
OpenFile.getline(str,20);
cout << str << endl;
OpenFile.close();//運(yùn)行結(jié)果:str的內(nèi)容為abc def ghi (一直把一行讀完)
get() put()進(jìn)行單個(gè)字符讀寫
ostream& put (char c);
函數(shù)功能:使用 put( )函數(shù),向文件中寫入字符
char ch='1';
ofstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯(cuò)誤!"<<endl;
exit(0);
}
OpenFile.put(ch); // 把字符1寫入文件
OpenFile.close();
istream& get (char& c);
函數(shù)功能:使用 get( )函數(shù),從文件中讀取字符
char ch;
ifstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯(cuò)誤!"<<endl;
exit(0);
}
OpenFile.get(ch);
cout << ch; //把字符1從文件中讀到ch(內(nèi)存)中
OpenFile.close();
二進(jìn)制文件讀寫
get() put()進(jìn)行單個(gè)字節(jié)讀寫
ofstream &put(char ch)
在內(nèi)存中寫入一個(gè)字節(jié)到文件
char ch='a';
ofstream OpenFile("file.txt",ios::binary);
//以二進(jìn)制的方式處理,在打開時(shí)要用 ios::binary 顯式聲明
if (OpenFile.fail())
{
cout<<"打開文件錯(cuò)誤!"<<endl;
exit(0);
}
OpenFile.put(ch);
OpenFile.close();
ifstream &get(char ch)
在文件中讀取一個(gè)字節(jié)到內(nèi)存
char ch;
ifstream OpenFile("file.txt",ios::binary);
if (OpenFile.fail())
{
cout<<"打開文件錯(cuò)誤!"<<endl;
exit(0);
}
OpenFile.get(ch); // 從文件中讀取一個(gè)字符
cout << ch;
OpenFile.close();
read() write()多個(gè)字節(jié)讀寫
ostream & ostream :: write ( char * buf , int n ) ;
功能:把buf指向的內(nèi)容取n個(gè)字節(jié)寫入文件
參數(shù)說明:buf表示要寫入內(nèi)存的地址,傳參時(shí)要取地址。n表示要讀入字節(jié)的長(zhǎng)度
注意:
- 該函數(shù)遇到空字符時(shí)并不停止,因而能夠?qū)懭胪暾念惤Y(jié)構(gòu)
- 第一個(gè)參數(shù)一個(gè)char型指針(指向內(nèi)存數(shù)據(jù)的起始地址),與對(duì)象結(jié)合使用的時(shí)候,要在對(duì)象地址之前要char做強(qiáng)制類型轉(zhuǎn)換
char ch[12]="12 3 456 78";
ofstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯(cuò)誤!"<<endl;
exit(0);
}
OpenFile.write(ch, 12);
OpenFile.close();
istream & read ( char * buf , int n ) ;
功能:從文件中提取 n 個(gè)字節(jié)數(shù)據(jù),寫入buf指向的地方中
char ch[12];
ifstream OpenFile("file.txt");
if (OpenFile.fail())
{
cout<<"打開文件錯(cuò)誤!"<<endl;
exit(0);
}
OpenFile.read(ch,12);
cout << ch; //運(yùn)行結(jié)果:數(shù)組ch的內(nèi)容為12 3 456 78
OpenFile.close();
注意事項(xiàng)
(1)程序不再使用文件時(shí),為什么要關(guān)閉文件?
因?yàn)椋?/p>
- 文件緩沖區(qū)是一塊小的內(nèi)存空間.
- 操作系統(tǒng)限制同時(shí)打開的文件數(shù)量
注意:close ( ) 函數(shù)關(guān)閉文件,但流對(duì)象仍然存在。
(2)文件的默認(rèn)打開方式為文本文件,要是想以二進(jìn)制的方式處理,在打開時(shí)要用 ios::binary 顯式聲明。
(3)針對(duì)文本文件操作時(shí),get函數(shù)和>>的區(qū)別:
- 在讀取數(shù)據(jù)時(shí),get函數(shù)包括空白字符(遇空白字符不停止讀取)
- >>在默認(rèn)情況下拒絕接受空白字符(遇到空白符停止讀取)
(4)文本文件的讀寫常使用的方法:使用<<寫入文件,使用getline 和 >> 讀到內(nèi)存
二進(jìn)制文件的讀寫常使用的方法:使用istream 類的成員函數(shù)read 和write 來實(shí)現(xiàn),
3.字符串輸入輸出流(sstream)
其相應(yīng)的派生類有istringstream類、ostringstream類、iostringstream類
sprintf sscanf 和 stringstream的使用
其實(shí)是整型和字符創(chuàng)類型的相互轉(zhuǎn)化:序列化(轉(zhuǎn)成字符串)和反序列化(將字符串中數(shù)據(jù)提取處理)
C當(dāng)中用法:sprintf和sscanf函數(shù)
C++中用法:字符串流
struct ServerInfo//要讀些的信息類
{
char _ip[20];
int _port;
};
//C當(dāng)中用法
//將info中數(shù)據(jù)轉(zhuǎn)成字符串并存入buff中
ServerInfo info = { "192.0.0.1", 8000 };
char buff[128];//buff的大小不好確定
sprintf_s(buff, "%s %d", info._ip, info._port);// 序列化,轉(zhuǎn)成字符串存入buff中
//將buff中數(shù)據(jù)格式化輸出到rinfo中
ServerInfo rinfo;
sscanf(buff, "%s%d", rinfo._ip, &rinfo._port);// 反序列化,將字符串buff中數(shù)據(jù)轉(zhuǎn)成規(guī)定格式
//空格間隔開了
//C++用法
//將info中數(shù)據(jù)轉(zhuǎn)成字符串并存到buff中
ServerInfo info = { "192.0.0.1", 8000 };
stringstream ssm;//字符串流對(duì)象
ssm << info._ip <<" "<<info._port;//轉(zhuǎn)成字符串
string buff = ssm.str();//查看字符串
//從字符串提取至rinfo
stringstream ssm;
ssm.str("127.0.0.1 90");//這兩行直接按照下面的寫法也行
//stringstream ssm("127.0.0.1 90");
ServerInfo rinfo;
ssm >> rinfo._ip >> rinfo._port;
補(bǔ)充內(nèi)容:C/C++中int和字符串類型的轉(zhuǎn)換
string轉(zhuǎn)int
- atoi(c庫(kù)函數(shù)、ascll to integer)
- strtol(c庫(kù)函數(shù),字符串轉(zhuǎn)成長(zhǎng)整型)
- stoi(stoi是C++的函數(shù),頭文件:#include < string >)
int轉(zhuǎn)string
- itoa(c庫(kù)函數(shù))
- to_string(C++11的函數(shù),可以適應(yīng)8種類型的重載,將其轉(zhuǎn)換為string,頭文件:#include < string >)
多功能轉(zhuǎn)換
stringstream
原文鏈接:https://blog.csdn.net/m0_60416282/article/details/125540129
相關(guān)推薦
- 2022-09-14 Python使用pip安裝Matplotlib的方法詳解_python
- 2024-03-08 jdk版本不兼容 Error creating bean with name ‘springSecu
- 2023-05-30 模型訓(xùn)練時(shí)GPU利用率太低的原因及解決_python
- 2022-06-25 Android開發(fā)MediaCodec和lamemp3多段音頻截取拼接_Android
- 2022-05-25 @NoArgsConstructor、@AllArgsConstructor、@RequiredAr
- 2022-05-29 C語言?超詳細(xì)模擬實(shí)現(xiàn)單鏈表的基本操作建議收藏_C 語言
- 2022-06-18 Elasticsearches之python使用及Django與Flask集成示例_python
- 2022-07-09 二分查找實(shí)現(xiàn)及優(yōu)化思考
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支