1. 程式人生 > >C++ STL常見錯誤整理

C++ STL常見錯誤整理

1, 若在結構體中含有 string,使用動態申請記憶體時用new,不可用molloc
  • string 是類(面對物件),例項化時需呼叫建構函式,而molloc無法呼叫建構函式,因此會造成記憶體衝突;而new則很好的解決了這個問題
2, string 的find函式是匹配字串,空格也算一個字元

string s;
s.find(" q ",3); //表示從地址3開始尋找字串 空格空格q空格
s.find("q",3); //表示從地址3開始尋找字串 q

3,getline按行讀檔案在fstream,string中引數區別

char ch[
80]; fstream inf(filename,ios::in); inf.getline(ch,80);//fstream中的getline,不可用string型別,無法強制轉換 string s; //inf.getline(ch,s);錯誤示例 //從檔案或是鍵盤讀取一行的通式 getline(inf,s);//讀取一行的通式,且可用string getline(cin,s);//鍵盤輸入

4,檔案流變數無法作為引數傳遞

//錯誤例項
void CreateRandFile(fstream outFile)
{
}
fstream outFile("a.dat",ios::binary | ios:
:out);//無法作為函式引數 CreateRandFile(outFile);//立刻報錯,因為與庫中衝突 //其實完全沒必要使用outFile做函式引數,因為outFile只是一把臨時的鑰匙, //你隨時隨地都可以申請一把,所以在函式內部申請一把效果也是一樣的 //可把檔案看做一個全域性儲存陣列,所以在任意位置均可開啟它

5,檔案流使用完及得關閉,反覆讀寫需重定位讀寫指標

fstream file("a.txt",ios::in);//以只讀、文字方式,開啟檔案
file.seekg(ios::beg);//讀指標重定位,回到起始點
file.seekp(ios::beg);//寫指標重定位,回到起始點
file.
close();//關閉,下次再開啟時讀寫指標均回到起點

6,字元與ASCII碼轉換

字元–》ASCII

char ch = '?';
int a;
a = ch;//自動轉換
cout<<ch-'\0'//計算與第一個字元的差值
cout<<a;//這兩種方式均可計算出字元的ASCII碼

ASCII–》字元

char ch;
int a = 43;
ch = a;//自動轉換
cout<<ch;

數字字元-》整型數字

char ch = '5';
int a;
a = ch -'0';//與字元0取差

7,哈夫曼解碼時對於中英文輸入有差別的字元只支援英文,中文一輸入就報錯,並輸出‘?’

8 二進位制檔案讀寫不可用string

string s = {"2134"};
char ch[5] = {"2134"};
fstream inFile("a.txt",ios::in|ios::binary);
inFile.read((char*)&s,sizeof(s));//一定報錯,string是動態記憶體管理
inFile.read((char*)ch,5*sizeof(char));//字元陣列是可以的

9 字元陣列末尾加 ‘\0’

不加的話無結束標記,輸出都一樣

10 檔案末尾多讀取一次解決辦法

模板一致,都是在迴圈中新增一個讀取是否成功判斷,若失敗,立即跳出迴圈
c語言讀取

字元讀取

	FILE *fid = fopen("c檔案讀寫.cpp","r");
	if(fid == NULL)cout<<"file open fail!"<<endl;
	//========字元讀取==============
	while(!feof(fid))
	{
		char ch = fgetc(fid);
		cout<<ch;
	}

按行讀取

//===============按行讀取=========================
/*	錯誤例項
while(!feof(fid))最後一個字元多讀一次 
	{
		char line[1024];
		fgets(line,1023,fid);
		cout<<line;
	}
*/	
	while(true)成功 
	{
		char line[1024];
		fgets(line,1023,fid);
		if(feof(fid))break;//判斷
		cout<<line;
	} 

c++讀取

字元讀取

fstream inFile("a.txt",ios::in);
char ch;
while(true)
{
	inFile>>ch;
	if(!inFile)break;
	cout<<ch;
}

按行讀取

string s;
while(true)
{
	getline(inFile,s);
	if(!inFile)break;
	cout<<s;
}