C 流操作之fstream

2021-12-30 01:07:53 字數 4217 閱讀 2239

在windows平台對檔案進行訪問操作可選的方案有很多,如果採用純c,則需要用到file*等,當然也可以直接呼叫windows api來做;如果採用c++,首先想到的就是檔案流fstream。雖然在com層面上,我們還可以使用istream來實現檔案的讀寫,其效率也非常高。不過本文僅對c++流操作做簡單的**,相比於windows api或istream,c++的流操作通用性更好一些,因為你能輕鬆將**移植到其它平台上。

fstream有兩個派生類,即ifstream和ofstream,分別對應輸入檔案流、輸出檔案流。在使用它們之前,必須將它們的標頭檔案包含到你的cpp檔案中。

建立乙個檔案流的方法很簡單:

ifstream fin;  

fin.open("c:\filename.txt");  

這樣就建立了乙個輸入檔案流fin,它對應的檔案是c盤根目錄下的filename.txt。實際上,open方法還包含乙個引數mode,用以指定其開啟方式。

ios::in 以讀取方式開啟檔案

ios::out 以寫入方式開啟檔案

ios::ate 訪問指標在檔案末尾

ios::app 寫入時採用追加方式

ios::trunc 寫入時抹去舊資料

ios::binary 以二進位制方式訪問

上面的**並未指定任何開啟方式,則採用預設引數:輸入檔案流即ios::in,輸出檔案流即ios::out。一般在需要組合特殊的mode才顯式指定,比如:

ios::in | ios::binary; //以二進位制方式讀取檔案

除此之外,還可以在構造時指定相應的檔案路徑和名稱,讓建立過程一步到位。上述**可改寫為:

ifstream fin("c:\filename.txt");

與open方法相反的是close方法,它的作用與open正好相反。open是將檔案流物件與外設中的檔案關聯起來,close則是解除二者的關聯。但是需要注意的是,close還起到清空快取的作用。最好讓open方法與close方法成對出現。

建立並開啟乙個檔案流後,就能像操作標準i/o那樣使用流插入操作符(<>)。對於輸入檔案流來說,可以呼叫getline函式從檔案流中讀取一整行資料,這樣就可以讀入含有空格的字串。

下面是乙個例子,該例的作用是讀取乙個stla格式的檔案。stl是一種常用快速成像檔案格式,其格式非常簡單,特別是ascii版本(即stla)。**如下所示:

stdafx.h

// stdafx.h : include file for standard system include files,  

// or project specific include files that are used frequently, but  

// are changed infrequently  

//  

#pragma once  

#include "targetver.h"  

#include  

#include  

//added  

#include  

#include  

#include  

#include  

#include  

using namespace std;  

// todo: reference additional headers your program requires here  

readstla.cpp

// readstla.cpp : defines the entry point for the console application.  

//  

#include "stdafx.h"  

struct facet ;  

int _tmain(int argc, _tchar* ar**)  

ifstream in(ar**[1]);  

if (!in.is_open())  

//var  

vector solid;  

string line;  

string word;  

//check format  

getline(in, line);  

if (line.find("solid") != 0)  

while (getline(in, line))  

getline(in, line); //"endloop"  

getline(in, line); //"endfacet"  

solid.push_back(f);  

}  }  

in.close();  

//output  

int cnt = solid.size();  

printf("read %d facet\n", cnt);  

for (int i = 0; i < cnt; i++)  

}  return 0;  

}  測試檔案為:

cube_corner.stl  

solid cube_corner  

facet normal 0.0 -1.0 0.0  

outer loop  

vertex 0.0 0.0 0.0  

vertex 1.0 0.0 0.0  

vertex 0.0 0.0 1.0  

endloop  

endfacet  

facet normal 0.0 0.0 -1.0  

outer loop  

vertex 0.0 0.0 0.0  

vertex 0.0 1.0 0.0  

vertex 1.0 0.0 0.0  

endloop  

endfacet  

facet normal 0.0 0.0 -1.0  

outer loop  

vertex 0.0 0.0 0.0  

vertex 0.0 0.0 1.0  

vertex 0.0 1.0 0.0  

endloop  

endfacet  

facet normal 0.577 0.577 0.577  

outer loop  

vertex 1.0 0.0 0.0  

vertex 0.0 1.0 0.0  

vertex 0.0 0.0 1.0  

endloop  

endfacet  

endsolid  

輸入結果為:

read 4 facet  

facet 1:  

normal = (0.000000, -1.000000, 0.000000)  

vertex[1] = (0.000000, 0.000000, 0.000000)  

vertex[2] = (1.000000, 0.000000, 0.000000)  

vertex[3] = (0.000000, 0.000000, 1.000000)  

facet 2:  

normal = (0.000000, 0.000000, -1.000000)  

vertex[1] = (0.000000, 0.000000, 0.000000)  

vertex[2] = (0.000000, 1.000000, 0.000000)  

vertex[3] = (1.000000, 0.000000, 0.000000)  

facet 3:  

normal = (0.000000, 0.000000, -1.000000)  

vertex[1] = (0.000000, 0.000000, 0.000000)  

vertex[2] = (0.000000, 0.000000, 1.000000)  

vertex[3] = (0.000000, 1.000000, 0.000000)  

facet 4:  

normal = (0.577000, 0.577000, 0.577000)  

vertex[1] = (1.000000, 0.000000, 0.000000)  

vertex[2] = (0.000000, 1.000000, 0.000000)  

vertex[3] = (0.000000, 0.000000, 1.000000)  

press any key to continue . . .    

C 之檔案操作(fstream)

關於檔案的操作,屬於c 的io 類範疇。一 在c 中,對檔案的操作是通過stream的子類fstream file stream 來實現的,就必須加入標頭檔案fstream.h。include using namespace std 二 開啟檔案 在fstream類中,有乙個成員函式open 就是用...

檔案流fstream 函式

include include include include or stdlib.h for exit const char file 1.txt 我要開啟的當前資料夾中的文字 int main 以追加的方式新增新的內容 if fout.is open cout enter guest names...

C 檔案操作詳解 fstream

c 中對檔案操作需要包含標頭檔案fstream 操作檔案三大類 ofstream 寫操作 ifstream 讀操作 fstream 讀寫操作 寫檔案 主要步驟 包含標頭檔案 include 2.建立流物件 ofstream ofs 3.開啟檔案 ofs.open 檔案路徑 開啟方式 4.寫資料 of...