C++ 輸入、輸出與IO流(一)

1. IO流的概念

當程序與外界環境進行信息交換時,存在兩個對象,一個是程序中的對象,另一個是文件對象。

流對象與文件操作:

  • 程序建立一個流對象
  • 指定這個流對象與某個文件對象建立聯繫
  • 程序操作流對象
  • 流對象通過文件系統對多連接的文件對象產生作用

提取與插入:

  • 讀操作在流數據抽象中被稱爲(從流中)提取
  • 寫操作被稱爲(向流中)插入

2. 輸出流概述

三種重要的輸出流

  • ostream
  • ofstream
  • ostringstream

預定義的輸出流對象

  • cout:標準輸出
  • cerr:標準錯誤輸出,沒有緩衝,發送給它的內容立即被輸出
  • clog:類似於cerr,但是有緩衝,緩衝區滿時被輸出

構造輸出流對象

  • ofstream類支持磁盤文件輸出
  • 如果在構造函數中指定一個文件名,當構造這個文件時刻是該文件自動打開的   ofstream myFile("filename");
  • 可以在調用默認構造函數之後使用open成員函數打開文件   
ofstream myFile;  //聲明一個靜態文件輸出流對象
myFile.open("filename");   //打開文件,使流對象與文件建立聯繫
  • 在構造對象或用open打開文件時可以指定模式
ofstream myFile("filename",ios_base::out|ios_base::binary);  //打開一個用於輸出的文件,並且該文件是二進制的

文件輸出流成員函數:

  • open函數  把流與一個特定的磁盤文件關聯起來;需要指定打開模式
  • put函數:把一個字符寫到輸出流中
  • write函數:將內存中的一塊內容寫到一個文件輸出流中
  • seekp和tellp函數:操作文件的內部指針
  • close函數:關閉與一個文件輸出流關聯的磁盤文件
  • 錯誤處理函數:在寫到一個流時進行錯誤處理

向文本文件輸出:

操縱符(manipulator)

  • 插入運算符與操縱符一起工作    控制輸出格式
  • 很多操縱符都定義在   ios_base類中(如hex())、<iomanip>頭文件(如setprecision())
  • 控制輸出寬度    在流中放入setw操縱符或調用width成員函數爲每個項指定輸出寬度
  • setw和width僅影響緊隨其後的輸出項,但其他流格式操縱符保持有效直到發生改變
  • dec、oct和hex操縱符設置輸入和輸出的默認進制

setionsflags的參數(流的格式標識):

/*控制輸出精度——指定fixed*/
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;

int main()
{
	double values[] = { 1.23, 35.36, 653.7, 4328.25 };
	string names[] = { "Zoots", "Jimmy", "Al", "Stan" };
	cout << setiosflags(ios_base::fixed);  //換成ios_base::scientific,用科學計數法
	for (int i = 0; i < 4; i++)
	{
		cout << setiosflags(ios_base::left)
			<< setw(6) << names[i]
			<< resetiosflags(ios_base::left)    //清除左對齊設置
			<< setw(6) << setprecision(1) << values[i] << endl;
	}

	system("pause");
	return 0;
}

二進制文件流:

  • 使用ofstream構造函數中的模式參量指定爲二進制輸出模式
  • 以通常方式構造一個流,然後使用setmode成員函數,在文件打開後改變模式
  • 通過二進制文件輸出流對象完成輸出
/*向磁盤文件中寫入二進制文件*/
#include<iostream>
#include<fstream>
using namespace std;

struct Date{
	int mon, day, year;
};

int main()
{
	Date dt = { 6, 10, 92 };
	ofstream file("data.dat", ios_base::binary);
	file.write(reinterpret_cast<char*>(&dt), sizeof(dt));
	file.close();

	system("pause");
	return 0;
}

字符串輸出流:

  • 用於構造字符串
  • 功能:支持ofstream類的除open、close外的所有操作  str函數可以返回當前已構造的字符串
  • 典型應用:將數值轉換爲字符串
/*將數值轉換爲字符串*/
#include<iostream>
#include<sstream>
#include<string>
using namespace std;

template <class T>
inline string toString(const T &v){
	ostringstream os;    //創建字符串輸出流
	os << v;            //將變量v的值寫入字符串流
	return os.str();     //返回輸出流生成的字符串
}

int main()
{
	string str1 = toString(5);
	cout << str1 << endl;
	string str2 = toString(1.2);
	cout << str2 << endl;

	system("pause");
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章