在實際工程中,經常遇到需要讀取txt文件,txt文件中存的是一些小數或者整型數據,在C++中,可以利用string類和ifstream庫文件對txt進行的讀取,不過讀回的數據經常是以字符串的形式返回,一般是txt的一行為一個字符串返回。那么如何從字符串中分離出整數或者是小數就涉及到字符串的分割問題,下面就該問題進行總結。
一、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(); //關閉文件
cin.get();
return 0;
}
執行結果如下:

注意:
(1)函數getline是一行一行讀取txt文件,讀回的結果以字符串的形式存儲在s中,要讀回具體的數據必須對字符串進行分離。
(2)打開txt必須用到fstream庫中的ifstream類和其open和close成員函數。
(3)文件讀取后一定要記得關閉文件,即調用close函數
二、字符串的分離
1讀取的txt中只有整形的情況(要讀回的txt文件如上圖中所示)
代碼如下:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
//如果字符串中都是整數
void stringTOnum1(string s, int* pdata)
{
bool temp=false; //讀取一個數據標志位
int data=0; //分離的一個數據
int m=0; //數組索引值
for(int i=0;i<s.length();i++)
{
while((s[i]>='0')&&(s[i]<='9')) //當前字符是數據,并一直讀后面的數據,只要遇到不是數字為止
{
temp=true; //讀數據標志位置位
data*=10;
data+=(s[i]-'0'); //字符在系統以ASCII碼存儲,要得到其實際值必須減去‘0'的ASCII值
i++;
}
//剛讀取了數據
if(temp) //判斷是否完全讀取一個數據
{
pdata[m]=data; //賦值
m++;
data=0;
temp=false; //標志位復位
}
}
}
int main()
{
int* pdata =new int[5];
string s;
//讀取第一個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;
}
執行的結果如下:

順利地讀取了每行數據并分離出了整型數據保存在了數組中。
注意:
(1)字符在系統中以其ASCII碼存儲,對于數字字符要得到其實際的值,必須減去‘0'字符的ASCII碼,之后的ASCII碼就與數字字符的數據一致。
(2)基本思想:當遇到一個字符是數據后,不停的循環讀后面的字符,直到遇到不是數字字符為止。
2讀取的txt中有小數的情況
讀回的txt如下圖所示:

分離字符的函數如下:
//如果字符串中有小數
void stringTOnum2(string s, double* pdata)
{
bool temp=false;
int ndata=0; //整數部分
double fdata=0; //小數部分
int n=0; //小數部分的位數
int m=0;
for(int i=0;i<s.length();i++)
{
while((s[i]>='0')&&(s[i]<='9')||(s[i]=='.')) //當前字符是數據或者是小數點
{
temp=true;
if(s[i]=='.') //遇到了小數點
{
//不停的讀取后面的小數
i++; //小數后的下一位
while((s[i]>='0')&&(s[i]<='9'))
{
n--;
fdata += (pow(10, n)*(s[i]-'0'));
i++;
}
}
//沒有遇到小數點
else
{
ndata*=10;
ndata+=(s[i]-'0');
i++;
}
}
//剛讀取了數據
if(temp)
{
pdata[m]=ndata+fdata;
m++;
ndata=0;
fdata=0;
n=0;
temp=false;
}
}
}
運行結果如下:

基本思想:在原先的基礎上不僅要判斷是否遇到了數字字符還需要判斷是都遇到了小數點‘.'字符,如果遇到小數點字符,將后面的數據循環讀取直到遇到不是數字字符為止。但是需要將其存為小數,有移位。
以上這篇C++中讀寫txt文件并分離字符的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。