溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中讀寫txt文件并分離字符的方法

發(fā)布時間:2020-10-08 09:59:07 來源:腳本之家 閱讀:167 作者:菜鳥程序猿0 欄目:編程語言

在實(shí)際工程中,經(jīng)常遇到需要讀取txt文件,txt文件中存的是一些小數(shù)或者整型數(shù)據(jù),在C++中,可以利用string類和ifstream庫文件對txt進(jìn)行的讀取,不過讀回的數(shù)據(jù)經(jīng)常是以字符串的形式返回,一般是txt的一行為一個字符串返回。那么如何從字符串中分離出整數(shù)或者是小數(shù)就涉及到字符串的分割問題,下面就該問題進(jìn)行總結(jié)。

一、C++中txt文件的讀取

需要讀取的txt文件如下:

C++中讀寫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é)果如下:

C++中讀寫txt文件并分離字符的方法

注意:

(1)函數(shù)getline是一行一行讀取txt文件,讀回的結(jié)果以字符串的形式存儲在s中,要讀回具體的數(shù)據(jù)必須對字符串進(jìn)行分離。

(2)打開txt必須用到fstream庫中的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;		//讀取一個數(shù)據(jù)標(biāo)志位
	int data=0;				//分離的一個數(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碼存儲,要得到其實(shí)際值必須減去‘0'的ASCII值
			i++;
		}
		//剛讀取了數(shù)據(jù)
		if(temp)		//判斷是否完全讀取一個數(shù)據(jù)
		{
			pdata[m]=data;		//賦值
			m++;
			data=0;		
			temp=false;		//標(biāo)志位復(fù)位
		}
	}
}
 
 
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;
}

執(zhí)行的結(jié)果如下:

C++中讀寫txt文件并分離字符的方法

順利地讀取了每行數(shù)據(jù)并分離出了整型數(shù)據(jù)保存在了數(shù)組中。

注意:

(1)字符在系統(tǒng)中以其ASCII碼存儲,對于數(shù)字字符要得到其實(shí)際的值,必須減去‘0'字符的ASCII碼,之后的ASCII碼就與數(shù)字字符的數(shù)據(jù)一致。

(2)基本思想:當(dāng)遇到一個字符是數(shù)據(jù)后,不停的循環(huán)讀后面的字符,直到遇到不是數(shù)字字符為止。

2讀取的txt中有小數(shù)的情況

讀回的txt如下圖所示:

C++中讀寫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++;
				}
			}
			//沒有遇到小數(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é)果如下:

C++中讀寫txt文件并分離字符的方法

基本思想:在原先的基礎(chǔ)上不僅要判斷是否遇到了數(shù)字字符還需要判斷是都遇到了小數(shù)點(diǎn)‘.'字符,如果遇到小數(shù)點(diǎn)字符,將后面的數(shù)據(jù)循環(huán)讀取直到遇到不是數(shù)字字符為止。但是需要將其存為小數(shù),有移位。

以上這篇C++中讀寫txt文件并分離字符的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI