1. 程式人生 > >C++進階-標準輸入輸出 IO

C++進階-標準輸入輸出 IO

基本概念

  • 從鍵盤到程式  標準輸入 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();