C++進階-標準輸入輸出 IO
阿新 • • 發佈:2018-12-13
基本概念
- 從鍵盤到程式 標準輸入 input
- 從程式到顯示器 標準輸出 output
- 標準輸入+標準輸出=標準I/O
- 檔案的輸入和輸出叫做檔案I/O
標準輸入輸出流的物件
- cerr : 沒有緩衝區
- clog 、cin、 cout :有緩衝區
cin
- cin.get() :讀取一個字元,返回值是字元,也可以傳入形參,讀完之後緩衝區就沒有這個字元
- cin.get(ch) : 讀取一個字元給ch
- cin.get(ch,10) : 讀取10個字元(最後一個\0)給ch
char ch[256];
cin.get(ch,3);
cout << ch << endl;
cin.ignore(2);
cin.get(ch,3);
cout << ch << endl;
輸入 abcdefg
輸出 ab
ef
- cin.getline() : 讀取一行的字元,預設遇到換行結束
char ch[10];
cin.get(ch, 5, '5');//遇到‘5’結束,5這個字元還在緩衝區,下次讀取的是5
cout << ch << endl;
char c;
cin.get(c);
cout << c << endl;
輸入 : 125678
輸出 : 12
5
------------------------------------------
char ch[10];
cin.getline(ch, 5, '5');// 5這個字元不在緩衝區,下次讀取的是5後面的字元,將5忽略了
cout << ch << endl;
char c;
cin.get(c);
cout << c << endl;
輸入 : 125678
輸出 : 12
6
- cin.ignore() : 忽略當前字元(從緩衝區取走了),形參表示忽略幾個字元,預設一個。
char ch;
cin.get (ch);
cout << ch << endl;
cin.ignore();
cin.get(ch);
cout << ch << endl;
輸入 abc
輸出 a
c
-
cin.peek() : 返回緩衝區的第一個字元,但是還在緩衝區,就是看一下
-
cin.putback() : get()拿走了,putback再將它放回去。
char ch;
cin.get(ch);
cin.putback(ch);
int number;
cin >> number;
cout << "您輸入的數字是:" << number << endl;
結果:輸入和輸出一樣
cout
- cout.flush() : 手動重新整理緩衝區
- cout.put() : 向緩衝區輸入一個字元
- cout.write() :
格式化輸出
5.格式化輸出(通過成員)
int number;
cin >> number;
cout.unsetf(ios::dec);//解除安裝當前的10進位制輸出
cout.setf(ios::hex);//設定當前為16進位制輸出
cout.setf(ios::showbase);//16進位制前面顯示0x 8進位制前面顯示0
cout.width(6); //設定6位寬
cout.fill('*'); //以~來填充 空
cout.setf(ios::left);//左對齊
cout << number << endl;
6.格式化輸出(通過控制符,需要包含標頭檔案iomanip)
cout << hex //16進位制輸出
<< setiosflags(ios::showbase)//16進位制前面顯示0x 8進位制前面顯示0
<< setw(6)//設定6位寬
<< setiosflags(ios::left)//左對齊
<< setfill('*')//以*來填充 空
<< number << endl;//
文字檔案輸入輸出流 ifstream ofstream fstream
const char* path1 = "C:\\Users\\VULCAN\\Desktop\\a.txt";
const char* path2 = "C:\\Users\\VULCAN\\Desktop\\b.txt";
ifstream ism(path1, ios::in);//檔案輸入流,in 讀
ofstream osm(path2, ios::out|ios::app);//檔案輸出流,out 寫,app 追加的方式
if (!ism)//內部有過載
{
cout << "開啟檔案失敗" << endl;
}
char ch;
while (ism.get(ch))
{
cout << ch;
osm.put(ch);//寫到 輸出檔案流
}
cout << endl;
ism.close();//關閉輸入檔案
osm.close();
文字模式、二進位制模式
- 在linux平臺下進行檔案讀寫時,文字模式和二進位制模式沒有區別
- 在windows下, (文字模式): 寫檔案將 換行\n 轉化成 回車換行\r\n 讀檔案將 將回車換行\r\n 轉化成 換行\n (二進位制模式) 不進行轉化
二進位制方式讀寫檔案
- 將物件以二進位制讀取,儲存-> 叫做物件序列化
class Person
{
public:
Person(int age, int name):m_age(age),m_name(name) { }
Person() { }
void show()
{
cout << m_age << " "<< m_name << endl;
}
int m_age;
int m_name;
};
Person p1(20, 10);
Person p2;
const char* path2 = "C:\\Users\\VULCAN\\Desktop\\b.txt";
ofstream osm(path2, ios::out|ios::binary);//out寫,binary二進位制方式
osm.write((char*)&p1, sizeof(Person));
osm.close();
ifstream ism(path2, ios::in | ios::binary);//讀
ism.read((char*)&p2, sizeof(Person));
p2.show();
ism.close();