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;
}