C++中讀寫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++中讀寫txt文件并分離字符的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)求解素?cái)?shù)的N種方法總結(jié)
哈嘍各位友友們,今天又學(xué)到了很多有趣的知識(shí),現(xiàn)在迫不及待的想和大家分享一下!本文將手把手帶領(lǐng)大家探討利用試除法、篩選法求解素?cái)?shù)的n層境界!都是精華內(nèi)容,可不要錯(cuò)過(guò)喲2023-01-01
vscode編譯運(yùn)行c語(yǔ)言報(bào)錯(cuò)亂碼的解決
本文主要介紹了vscode編譯運(yùn)行c語(yǔ)言報(bào)錯(cuò)亂碼,文中通過(guò)圖文介紹的的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
json格式解析和libjson的用法介紹(關(guān)于cjson的使用方法)
下面小編就為大家?guī)?lái)一篇json格式解析和libjson的用法介紹(關(guān)于cjson的使用方法)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
C語(yǔ)言運(yùn)算符的優(yōu)先級(jí)和結(jié)合性實(shí)例詳解
本文主要介紹C語(yǔ)言運(yùn)算符的知識(shí),這里對(duì)運(yùn)算符的優(yōu)先級(jí)和結(jié)合性做出了詳解,并附實(shí)例代碼,希望能幫助有需要的小伙伴2016-07-07
C語(yǔ)言實(shí)現(xiàn)計(jì)算圓周長(zhǎng)以及面積
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)計(jì)算圓周長(zhǎng)以及面積方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C++函數(shù)的嵌套調(diào)用和遞歸調(diào)用學(xué)習(xí)教程
這篇文章主要介紹了C++函數(shù)的嵌套調(diào)用和遞歸調(diào)用學(xué)習(xí)教程,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解
這篇文章主要介紹了StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
VS2017開(kāi)發(fā)C語(yǔ)言出現(xiàn)“no_init_all“的解決辦法
這篇文章介紹了VS2017開(kāi)發(fā)C語(yǔ)言出現(xiàn)“no_init_all“的解決辦法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12

