C++ STL常見錯誤整理
阿新 • • 發佈:2019-01-12
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;
}