C++?IO設(shè)備讀寫(xiě)功能實(shí)現(xiàn)詳解
1 輸入輸出IO流
1.1 圖解輸入輸出流
IO設(shè)備:文件、終端(dos黑框框)、特殊的數(shù)據(jù)類(lèi)型(streamstring)

1.2 輸入輸出流類(lèi)庫(kù)
C++中的輸入輸出流是靠定義好的類(lèi)庫(kù)來(lái)操作的

2 文件讀寫(xiě)操作
2.1 文件的打開(kāi)方式

2.2 文件讀寫(xiě)類(lèi)庫(kù)的頭文件
頭文件:fstream
ofstream:讀寫(xiě)
istream:讀操作
ofstream:寫(xiě)操作
2.3 文本文件讀寫(xiě)
使用ofstream來(lái)寫(xiě)文本
ofstream寫(xiě)入文件默認(rèn)打開(kāi)方式是ios::trunc,即沒(méi)有文件那么創(chuàng)建,該文件存在并且有內(nèi)容會(huì)直接清空內(nèi)容
#include<iostream>
#include<windows.h>
#include<fstream>
using namespace std;
int main() {
ofstream outfile;
string name;
int age;
cin >> name >> age;
outfile.open("C:/Users/98207/desktop/test.txt", ios::out); // 寫(xiě)入文件,沒(méi)有文件會(huì)新建
outfile << name << endl;
outfile << age;
outfile.close(); // 文件結(jié)束需要關(guān)閉
return 0;
}

使用ifstream讀取文件
程序:
#include<iostream>
#include<windows.h>
#include<string>
#include<fstream>
using namespace std;
int main() {
ifstream infile;
string str;
int age;
infile.open("C:/Users/98207/desktop/test.txt", ios::in); // 讀取文件
while (1) {
if (infile.eof()) {
break;
}
infile >> str;
cout << str << endl;;
// getline(infile, str);
// cout << str << endl;
}
infile .close();
return 0;
}
結(jié)果:
bian
12
使用fstream來(lái)讀寫(xiě)文件
寫(xiě)入文件fstream默認(rèn)不會(huì)截?cái)辔募?/p>
#include<iostream>
#include<windows.h>
#include<string>
#include<fstream>
using namespace std;
int main() {
string name;
int age;
fstream outfile;
outfile.open("C:/Users/98207/Desktop/test2.txt", ios::out);
cin >> name >> age;
outfile << name << endl;
outfile << age;
outfile.close();
return 0;
}

讀取文件
#include<iostream>
#include<windows.h>
#include<string>
#include<fstream>
using namespace std;
int main() {
string str;
fstream infile;
infile.open("C:/Users/98207/Desktop/test2.txt", ios::in);
while (1) {
if (infile.eof()) {
break;
}
infile >> str;
cout << str << endl;
}
infile.close();
return 0;
}

2.4 二進(jìn)制的讀寫(xiě)
二進(jìn)制和文本寫(xiě)區(qū)別在于數(shù)字,二進(jìn)制數(shù)字是把實(shí)際字節(jié)數(shù)寫(xiě)入進(jìn)去。
比如整數(shù)9,那么寫(xiě)入的是4個(gè)char字符0009,至于存儲(chǔ)的大小端方式要看cpu。
2.4.1 二進(jìn)制寫(xiě)
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main() {
fstream outfile;
char name[20];
int age;
// 為什么保存格式是dat,因?yàn)槭褂梦谋靖袷綍?huì)按照文本格式解析,最后出來(lái)的是亂碼
outfile.open("C:/Users/98207/Desktop/1.dat", ios::trunc | ios::out | ios::binary);
cin >> name >> age;
outfile << name << '\t';
outfile.write((char*)&age, sizeof(age)); // 二進(jìn)制寫(xiě)
outfile.close();
return 0;
}

2.4.2 二進(jìn)制讀
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main() {
fstream infile;
char name[20];
char temp;
int age;
infile.open("C:/Users/98207/Desktop/1.dat", ios::in | ios::binary);
infile >> name;
infile.read((char*)&temp, sizeof(temp)); // 丟棄制表符
infile.read((char*)&age, sizeof(age));
cout << name << '\t' << age << endl;
infile.close();
return 0;
}

2.5 按照特殊格式讀寫(xiě)
2.5.1 特殊格式寫(xiě)入
#include<iostream>
#include<fstream> //ofstream
#include<sstream> // stringstream
using namespace std;
int main() {
stringstream ret;
ofstream outfile;
string name;
int age;
outfile.open("C:/Users/98207/Desktop/test2.txt", ios::out | ios::trunc);
while (1) {
cin >> name >> age;
if (cin.eof()) {
break;
}
ret << name << "\t\t\t" << age << endl; // ret會(huì)累積
// outfile << ret.str();
// ret.clear();
}
outfile << ret.str();
outfile.close();
return 0;
}
2.5.2 特殊格式讀取
#include<iostream>
#include<fstream>
#include<string> // getline, string
using namespace std;
int main() {
fstream infile;
string str;
char name[20];
int age;
infile.open("C:/Users/98207/Desktop/test2.txt", ios::in);
while (1) {
getline(infile, str);
if (infile.eof()) {
break;
}
sscanf_s(str.c_str(), "%s %d", name, sizeof(name), & age); // 這里的參數(shù)只能是char類(lèi)型,這里的空格會(huì)替換文件的制表符或者空格
cout << name << "\t\t\t" << age << endl;
}
infile.close();
return 0;
}
2.6 文件流標(biāo)志
這里常用的就是is_open()和eof()

2.7 文件指針
輸入流指針seekg
原形:basic_istream& seekg( off_type off, // 偏移量
std::ios_base::seekdir dir); // 起始位置
作用:設(shè)置輸入流位置
參數(shù)1:偏移量
參數(shù)2:相對(duì)位置
- beg 相對(duì)于開(kāi)始位置
- cur 相對(duì)于當(dāng)前位置
- end 相對(duì)于結(jié)束位置
從開(kāi)始位置文件指針偏移5個(gè)字節(jié),然后讀取內(nèi)容
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main() {
// ofstream infile;
ifstream infile;
string str;
infile.open("C:/Users/98207/Desktop/1.txt", ios::in);
infile.seekg(5, ios::beg); // 從開(kāi)始位置偏移5個(gè)字節(jié)
while (1) {
getline(infile, str);
cout << str;
if (infile.eof()) {
break;
}
}
infile.close();
return 0;
}
輸入流指針tellg
作用:返回輸入流的當(dāng)前位置(距離文件的起始位置的偏移量)
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main() {
ifstream infile;
string str;
infile.open("C:/Users/98207/Desktop/1.txt", ios::in);
infile.seekg(5, ios::beg); // 設(shè)置偏移量位5個(gè)字節(jié)
cout << "文件指針偏移量:" << infile.tellg() << endl; // 相對(duì)于文件起始位置
infile.close();
return 0;
}結(jié)果:
文件指針偏移量:5
E:\Microsoft Visual Studio\code\Project15\x64\Debug\Project15.exe (進(jìn)程 68440)已退出,代碼為 0。
要在調(diào)試停止時(shí)自動(dòng)關(guān)閉控制臺(tái),請(qǐng)啟用“工具”->“選項(xiàng)”->“調(diào)試”->“調(diào)試停止時(shí)自動(dòng)關(guān)閉控制臺(tái)”。
按任意鍵關(guān)閉此窗口. . .
輸出流指針seekp
作用:設(shè)置輸出流位置
函數(shù)原形:basic_ostream& seekp( off_type off, // 偏移量
std::ios_base::seekdir dir ); // 起始位置
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main() {
ofstream outfile;
outfile.open("user1.txt", ios::out | ios::trunc);
outfile << "123456789";
outfile.seekp(3, ios::beg); // 指針先指向開(kāi)頭,然后向后偏移三個(gè)字節(jié)
outfile << "ABC";
outfile.close();
return 0;
}
到此這篇關(guān)于C++ IO設(shè)備讀寫(xiě)功能實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)C++ IO設(shè)備讀寫(xiě)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++詳細(xì)講解構(gòu)造函數(shù)的拷貝流程
拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它在創(chuàng)建對(duì)象時(shí),是使用同一類(lèi)中之前創(chuàng)建的對(duì)象來(lái)初始化新創(chuàng)建的對(duì)象??截悩?gòu)造函數(shù)通常用于:通過(guò)使用另一個(gè)同類(lèi)型的對(duì)象來(lái)初始化新創(chuàng)建的對(duì)象。?復(fù)制對(duì)象把它作為參數(shù)傳遞給函數(shù)。復(fù)制對(duì)象,并從函數(shù)返回這個(gè)對(duì)象2022-05-05
C++結(jié)構(gòu)體struct和類(lèi)class區(qū)別詳解
struct和class有什么區(qū)別?最本質(zhì)的一個(gè)區(qū)別就是默認(rèn)的訪(fǎng)問(wèn)控制:默認(rèn)的繼承訪(fǎng)問(wèn)權(quán)限,struct是public的,class是private的。2017-11-11
C語(yǔ)言猜兇手及類(lèi)似題目的實(shí)現(xiàn)示例
本文主要介紹了C語(yǔ)言猜兇手及類(lèi)似題目的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之中綴樹(shù)轉(zhuǎn)后綴樹(shù)的實(shí)例
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之中綴樹(shù)轉(zhuǎn)后綴樹(shù)的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-08-08
C語(yǔ)言順序表的基本結(jié)構(gòu)與實(shí)現(xiàn)思路詳解
順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線(xiàn)性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ)。本文將通過(guò)示例為大家講解一下順序表的基本操作,需要的可以參考一下2023-02-02
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法時(shí)間空間復(fù)雜度基礎(chǔ)實(shí)踐
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法中時(shí)間空間復(fù)雜度的基礎(chǔ)實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
C/C++題解LeetCode1295統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字
這篇文章主要為大家介紹了C/C++題解LeetCode1295統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

