[TOC]
# 簡介
和文件有關系的輸入輸出類主要在fstream.h這個頭文件中被定義,在這個頭文件中主要被定義了三個類,由這三個類控制對文件的各種輸入輸出操作,他們分別是ifstream、ofstream、fstream,其中fstream類是由iostream類派生而來,他們之間的繼承關系見下圖所示:

由于文件設備并不像顯示器屏幕與鍵盤那樣是標準默認設備,所以它在fstream頭文件中是沒有像cout那樣預先定義的全局對象,所以我們必須自己定義一個該類的對象。
ifstream類,它是從istream類派生的,用來支持從磁盤文件的輸入。
ofstream類,它是從ostream類派生的,用來支持向磁盤文件的輸出。
fstream類,它是從iostream類派生的,用來支持對磁盤文件的輸入輸出。
# 打開文件
所謂打開(open)文件是一種形象的說法,如同打開房門就可以進入房間活動一樣。 打開文件是指在文件讀寫之前做必要的準備工作,包括:
1)為文件流對象和指定的磁盤文件建立關聯,以便使文件流流向指定的磁盤文件。
2)指定文件的工作方式,如:該文件是作為輸入文件還是輸出文件,是ASCII文件還是二進制文件等。
以上工作可以通過兩種不同的方法實現:
1) 調用文件流的成員函數open。如
~~~
ofstream outfile; //定義ofstream類(輸出文件流類)對象outfile
outfile.open("f1.dat",ios::out); //使文件流與f1.dat文件建立關聯
~~~
第2行是調用輸出文件流的成員函數open打開磁盤文件f1.dat,并指定它為輸出文件, 文件流對象outfile將向磁盤文件f1.dat輸出數據。ios::out是I/O模式的一種,表示 以輸出方式打開一個文件。或者簡單地說,此時f1.dat是一個輸出文件,接收從內存 輸出的數據。
磁盤文件名可以包括路徑,如`"c:\\\\new\\\\f1.dat"`,如缺省路徑,則默認為當前目錄下的文件。
2) 在定義文件流對象時指定參數
在聲明文件流類時定義了帶參數的構造函數,其中包含了打開磁盤文件的功能。因此, 可以在定義文件流對象時指定參數,調用文件流類的構造函數來實現打開文件的功能。

幾點說明:
1) 新版本的I/O類庫中不提供ios::nocreate和ios::noreplace。
2) 每一個打開的文件都有一個文件指針,該指針的初始位置由I/O方式指定,每次讀寫都從文件指針的當前位置開始。每讀入一個字節,指針就后移一個字節。當文件指針移到最后,就會遇到文件結束EOF(文件結束符也占一個字節,其值為-1),此時流對象的成員函數eof的值為非0值(一般設為1),表示文件結束了。
3) 可以用“位或”運算符“|”對輸入輸出方式進行組合,如表13.6中最后3行所示那樣。還可以舉出下面一些例子:
~~~
? ? ios::in | ios:: noreplace ?//打開一個輸入文件,若文件不存在則返回打開失敗的信息
? ? ios::app | ios::nocreate ?//打開一個輸出文件,在文件尾接著寫數據,若文件不存在,則返回打開失敗的信息
? ? ios::out l ios::noreplace ?//打開一個新文件作為輸出文件,如果文件已存在則返回打開失敗的信息
? ? ios::in l ios::out I ios::binary ?//打開一個二進制文件,可讀可寫
~~~
但不能組合互相排斥的方式,如 `ios::nocreate l ios::noreplace`。
4) 如果打開操作失敗,open函數的返回值為0(假),如果是用調用構造函數的方式打開文件的,則流對象的值為0。可以據此測試打開是否成功。如
~~~
? ? if(outfile.open("f1.bat", ios::app) ==0)
? ? ? ? cout <<"open error";
或
? ? if( !outfile.open("f1.bat", ios::app) )
? ? ? ? cout <<"open error";
~~~
# 關閉文件
在對已打開的磁盤文件的讀寫操作完成后,應關閉該文件。關閉文件用成員函數close。如:outfile.close( ); ?//將輸出文件流所關聯的磁盤文件關閉
所謂關閉,實際上是解除該磁盤文件與文件流的關聯,原來設置的工作方式也失效,這樣,就不能再通過文件流對該文件進行輸入或輸出.
# 二進制文件的讀寫操作
二進制文件不是以ASCII代碼存放數據的,它將內存中數據存儲形式不加轉換地傳送到磁盤文件,因此它又稱為內存數據的映像文件。因為文件中的信息不是字符數據,而是字節中的二進制形式的信息,因此它又稱為字節文件。
對二進制文件的操作也需要先打開文件,用完后要關閉文件。在打開時要用ios::binary指定為以二進制形式傳送和存儲。二進制文件除了可以作為輸入文件或輸出文件外,還可以是既能輸入又能輸出的文件。這是和ASCII文件不同的地方
**用成員函數read和write讀寫二進制文件**
對二進制文件的讀寫主要用istream類的成員函數read和write來實現。這兩個成員函數的原型為
~~~
? ? istream& read(char *buffer,int len);
? ? ostream& write(const char * buffer,int len);
~~~
字符指針buffer指向內存中一段存儲空間。len是讀寫的字節數。調用的方式為:a. write(p1,50);
? ? b. read(p2,30); 上面第一行中的a是輸出文件流對象,write函數將字符指針p1所給出的地址開始的50個字節的內容不加轉換地寫到磁盤文件中。在第二行中,b是輸入文件流對象,read 函數從b所關聯的磁盤文件中,讀入30個字節(或遇EOF結束),存放在字符指針p2所指的一段空間內。
# ASCII文件的讀寫操作
如果文件的每一個字節中均以ASCII代碼形式存放數據,即一個字節存放一個字符,這個文件就是ASCII文件(或稱字符文件)。程序可以從ASCII文件中讀入若干個字符,也可以向它輸出一些字符。
1) 用流插入運算符“>”輸入輸出標準類型的數據。“>”都巳在iostream中被重載為能用于ostream和istream類對象的標準類型的輸入輸出。由于ifstream和 ofstream分別是ostream和istream類的派生類;因此它們從ostream和istream類繼承了公用的重載函數,所以在對磁盤文件的操作中,可以通過文件流對象和流插入運算符“>”實現對磁盤 文件的讀寫,如同用cin、cout和>對標準設備進行讀寫一樣。
2) 用文件流的put、get、geiline等成員函數進行字符的輸入輸出:用C++流成員函數put輸出單個字符、C++ get()函數讀入一個字符和C++ getline()函數讀入一行字符。
- c語言
- 基礎知識
- 變量和常量
- 宏定義和預處理
- 隨機數
- register變量
- errno全局變量
- 靜態變量
- 類型
- 數組
- 類型轉換
- vs中c4996錯誤
- 數據類型和長度
- 二進制數,八進制數和十六進制數
- 位域
- typedef定義類型
- 函數和編譯
- 函數調用慣例
- 函數進棧和出棧
- 函數
- 編譯
- sizeof
- main函數接收參數
- 宏函數
- 目標文件和可執行文件有什么
- 強符號和弱符號
- 什么是鏈接
- 符號
- 強引用和弱引用
- 字符串處理函數
- sscanf
- 查找子字符串
- 字符串指針
- qt
- MFC
- 指針
- 簡介
- 指針詳解
- 案例
- 指針數組
- 偏移量
- 間接賦值
- 易錯點
- 二級指針
- 結構體指針
- 字節對齊
- 函數指針
- 指針例子
- main接收用戶輸入
- 內存布局
- 內存分區
- 空間開辟和釋放
- 堆空間操作字符串
- 內存處理函數
- 內存分頁
- 內存模型
- 棧
- 棧溢出攻擊
- 內存泄露
- 大小端存儲法
- 寄存器
- 結構體
- 共用體
- 枚舉
- 文件操作
- 文件到底是什么
- 文件打開和關閉
- 文件的順序讀寫
- 文件的隨機讀寫
- 文件復制
- FILE和緩沖區
- 文件大小
- 插入,刪除,更改文件內容
- typeid
- 內部鏈接和外部鏈接
- 動態庫
- 調試器
- 調試的概念
- vs調試
- 多文件編程
- extern關鍵字
- 頭文件規范
- 標準庫以及標準頭文件
- 頭文件只包含一次
- static
- 多線程
- 簡介
- 創建線程threads.h
- 創建線程pthread
- gdb
- 簡介
- mac使用gdb
- setjump和longjump
- 零拷貝
- gc
- 調試器原理
- c++
- c++簡介
- c++對c的擴展
- ::作用域運算符
- 名字控制
- cpp對c的增強
- const
- 變量定義數組
- 盡量以const替換#define
- 引用
- 內聯函數
- 函數默認參數
- 函數占位參數
- 函數重載
- extern "C"
- 類和對象
- 類封裝
- 構造和析構
- 深淺拷貝
- explicit關鍵字
- 動態對象創建
- 靜態成員
- 對象模型
- this
- 友元
- 單例
- 繼承
- 多態
- 運算符重載
- 賦值重載
- 指針運算符(*,->)重載
- 前置和后置++
- 左移<<運算符重載
- 函數調用符重載
- 總結
- bool重載
- 模板
- 簡介
- 普通函數和模板函數調用
- 模板的局限性
- 類模板
- 復數的模板類
- 類模板作為參數
- 類模板繼承
- 類模板類內和類外實現
- 類模板和友元函數
- 類模板實現數組
- 類型轉換
- 異常
- 異常基本語法
- 異常的接口聲明
- 異常的棧解旋
- 異常的多態
- 標準異常庫
- 自定義異常
- io
- 流的概念和類庫結構
- 標準io流
- 標準輸入流
- 標準輸出流
- 文件讀寫
- STL
- 簡介
- string容器
- vector容器
- deque容器
- stack容器
- queue容器
- list容器
- set/multiset容器
- map/multimap容器
- pair對組
- 深淺拷貝問題
- 使用時機
- 常用算法
- 函數對象
- 謂詞
- 內建函數對象
- 函數對象適配器
- 空間適配器
- 常用遍歷算法
- 查找算法
- 排序算法
- 拷貝和替換算法
- 算術生成算法
- 集合算法
- gcc
- GDB
- makefile
- visualstudio
- VisualAssistX
- 各種插件
- utf8編碼
- 制作安裝項目
- 編譯模式
- 內存對齊
- 快捷鍵
- 自動補全
- 查看c++類內存布局
- FFmpeg
- ffmpeg架構
- 命令的基本格式
- 分解與復用
- 處理原始數據
- 錄屏和音
- 濾鏡
- 水印
- 音視頻的拼接與裁剪
- 視頻圖片轉換
- 直播
- ffplay
- 常見問題
- 多媒體文件處理
- ffmpeg代碼結構
- 日志系統
- 處理流數據
- linux
- 系統調用
- 常用IO函數
- 文件操作函數
- 文件描述符復制
- 目錄相關操作
- 時間相關函數
- 進程
- valgrind
- 進程通信
- 信號
- 信號產生函數
- 信號集
- 信號捕捉
- SIGCHLD信號
- 不可重入函數和可重入函數
- 進程組
- 會話
- 守護進程
- 線程
- 線程屬性
- 互斥鎖
- 讀寫鎖
- 條件變量
- 信號量
- 網絡
- 分層模型
- 協議格式
- TCP協議
- socket
- socket概念
- 網絡字節序
- ip地址轉換函數
- sockaddr數據結構
- 網絡套接字函數
- socket模型創建流程圖
- socket函數
- bind函數
- listen函數
- accept函數
- connect函數
- C/S模型-TCP
- 出錯處理封裝函數
- 多進程并發服務器
- 多線程并發服務器
- 多路I/O復用服務器
- select
- poll
- epoll
- epoll事件
- epoll例子
- epoll反應堆思想
- udp
- socket IPC(本地套接字domain)
- 其他常用函數
- libevent
- libevent簡介