C++中讀寫(xiě)txt文件并分離字符的方法
在實(shí)際工程中,經(jīng)常遇到需要讀取txt文件,txt文件中存的是一些小數(shù)或者整型數(shù)據(jù),在C++中,可以利用string類和ifstream庫(kù)文件對(duì)txt進(jìn)行的讀取,不過(guò)讀回的數(shù)據(jù)經(jīng)常是以字符串的形式返回,一般是txt的一行為一個(gè)字符串返回。那么如何從字符串中分離出整數(shù)或者是小數(shù)就涉及到字符串的分割問(wèn)題,下面就該問(wèn)題進(jìn)行總結(jié)。
一、C++中txt文件的讀取
需要讀取的txt文件如下:
代碼如下:
#include<iostream> #include<string> #include<fstream> using namespace std; int main() { string s; //每次讀取一行txt文件返回的字符串 //讀取一txt文件 ifstream infile1; infile1.open("1.txt"); while(getline(infile1, s)) { cout << s << endl; } infile1.close(); //關(guān)閉文件 cin.get(); return 0; }
執(zhí)行結(jié)果如下:
注意:
(1)函數(shù)getline是一行一行讀取txt文件,讀回的結(jié)果以字符串的形式存儲(chǔ)在s中,要讀回具體的數(shù)據(jù)必須對(duì)字符串進(jìn)行分離。
(2)打開(kāi)txt必須用到fstream庫(kù)中的ifstream類和其open和close成員函數(shù)。
(3)文件讀取后一定要記得關(guān)閉文件,即調(diào)用close函數(shù)
二、字符串的分離
1讀取的txt中只有整形的情況(要讀回的txt文件如上圖中所示)
代碼如下:
#include<iostream> #include<string> #include<fstream> using namespace std; //如果字符串中都是整數(shù) void stringTOnum1(string s, int* pdata) { bool temp=false; //讀取一個(gè)數(shù)據(jù)標(biāo)志位 int data=0; //分離的一個(gè)數(shù)據(jù) int m=0; //數(shù)組索引值 for(int i=0;i<s.length();i++) { while((s[i]>='0')&&(s[i]<='9')) //當(dāng)前字符是數(shù)據(jù),并一直讀后面的數(shù)據(jù),只要遇到不是數(shù)字為止 { temp=true; //讀數(shù)據(jù)標(biāo)志位置位 data*=10; data+=(s[i]-'0'); //字符在系統(tǒng)以ASCII碼存儲(chǔ),要得到其實(shí)際值必須減去‘0'的ASCII值 i++; } //剛讀取了數(shù)據(jù) if(temp) //判斷是否完全讀取一個(gè)數(shù)據(jù) { pdata[m]=data; //賦值 m++; data=0; temp=false; //標(biāo)志位復(fù)位 } } } int main() { int* pdata =new int[5]; string s; //讀取第一個(gè)txt文件 ifstream infile1; infile1.open("1.txt"); while(getline(infile1, s)) { stringTOnum1(s, pdata); for(int i=0;i<5;i++) cout << pdata[i] << " "; cout << endl; } infile1.close(); cin.get(); return 0; }
執(zhí)行的結(jié)果如下:
順利地讀取了每行數(shù)據(jù)并分離出了整型數(shù)據(jù)保存在了數(shù)組中。
注意:
(1)字符在系統(tǒng)中以其ASCII碼存儲(chǔ),對(duì)于數(shù)字字符要得到其實(shí)際的值,必須減去‘0'字符的ASCII碼,之后的ASCII碼就與數(shù)字字符的數(shù)據(jù)一致。
(2)基本思想:當(dāng)遇到一個(gè)字符是數(shù)據(jù)后,不停的循環(huán)讀后面的字符,直到遇到不是數(shù)字字符為止。
2讀取的txt中有小數(shù)的情況
讀回的txt如下圖所示:
分離字符的函數(shù)如下:
//如果字符串中有小數(shù) void stringTOnum2(string s, double* pdata) { bool temp=false; int ndata=0; //整數(shù)部分 double fdata=0; //小數(shù)部分 int n=0; //小數(shù)部分的位數(shù) int m=0; for(int i=0;i<s.length();i++) { while((s[i]>='0')&&(s[i]<='9')||(s[i]=='.')) //當(dāng)前字符是數(shù)據(jù)或者是小數(shù)點(diǎn) { temp=true; if(s[i]=='.') //遇到了小數(shù)點(diǎn) { //不停的讀取后面的小數(shù) i++; //小數(shù)后的下一位 while((s[i]>='0')&&(s[i]<='9')) { n--; fdata += (pow(10, n)*(s[i]-'0')); i++; } } //沒(méi)有遇到小數(shù)點(diǎn) else { ndata*=10; ndata+=(s[i]-'0'); i++; } } //剛讀取了數(shù)據(jù) if(temp) { pdata[m]=ndata+fdata; m++; ndata=0; fdata=0; n=0; temp=false; } } }
運(yùn)行結(jié)果如下:
基本思想:在原先的基礎(chǔ)上不僅要判斷是否遇到了數(shù)字字符還需要判斷是都遇到了小數(shù)點(diǎn)‘.'字符,如果遇到小數(shù)點(diǎn)字符,將后面的數(shù)據(jù)循環(huán)讀取直到遇到不是數(shù)字字符為止。但是需要將其存為小數(shù),有移位。
以上這篇C++中讀寫(xiě)txt文件并分離字符的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
全面了解結(jié)構(gòu)體、聯(lián)合體和枚舉類型
下面小編就為大家?guī)?lái)一篇全面了解結(jié)構(gòu)體、聯(lián)合體和枚舉類型。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07C語(yǔ)言模擬實(shí)現(xiàn)atoi函數(shù)的實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言模擬實(shí)現(xiàn)atoi函數(shù)的實(shí)例詳解的相關(guān)資料,atoi函數(shù),主要功能是將一個(gè)字符串轉(zhuǎn)變?yōu)檎麛?shù),這里就實(shí)現(xiàn)這樣的函數(shù),需要的朋友可以參考下2017-08-08學(xué)習(xí)C和C++的9點(diǎn)經(jīng)驗(yàn)總結(jié)
本文給大家總結(jié)了一下我們?cè)趯W(xué)習(xí)C和C++的時(shí)候的一些經(jīng)驗(yàn)和需要注意的事項(xiàng),希望能給大家一些幫助,少走些彎路2015-12-12基于VC 6.0使用C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊
這篇文章主要為大家詳細(xì)介紹了基于VC 6.0使用C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06C++11生成隨機(jī)數(shù)(random庫(kù))的使用
隨機(jī)數(shù)在很多地方都可以用到,本文主要介紹了C++11生成隨機(jī)數(shù)(random庫(kù))的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01