C++流操作之fstream用法介紹
在Windows平臺(tái)對(duì)文件進(jìn)行存取操作可選的方案有很多,如果采用純C,則需要用到File*等,當(dāng)然也可以直接調(diào)用Windows API來(lái)做;如果采用C++,首先想到的就是文件流fstream。雖然在COM層面上,我們還可以使用IStream來(lái)實(shí)現(xiàn)文件的讀寫,其效率也非常高。不過(guò)本文僅對(duì)C++流操作做簡(jiǎn)單的探討,相比于Windows API或IStream,C++的流操作通用性更好一些,因?yàn)槟隳茌p松將代碼移植到其它平臺(tái)上。
fstream有兩個(gè)派生類,即ifstream和ofstream,分別對(duì)應(yīng)輸入文件流、輸出文件流。在使用它們之前,必須將它們的頭文件包含到你的cpp文件中。
創(chuàng)建一個(gè)文件流的方法很簡(jiǎn)單:
ifstream fin;
fin.open("C:\filename.txt");
這樣就創(chuàng)建了一個(gè)輸入文件流fin,它對(duì)應(yīng)的文件是C盤根目錄下的filename.txt。實(shí)際上,open方法還包含一個(gè)參數(shù)mode,用以指定其打開(kāi)方式。
ios::in 以讀取方式打開(kāi)文件
ios::out 以寫入方式打開(kāi)文件
ios::ate 存取指針在文件末尾
ios::app 寫入時(shí)采用追加方式
ios::trunc 寫入時(shí)抹去舊數(shù)據(jù)
ios::binary 以二進(jìn)制方式存取
上面的代碼并未指定任何打開(kāi)方式,則采用默認(rèn)參數(shù):輸入文件流即ios::in,輸出文件流即ios::out。一般在需要組合特殊的mode才顯式指定,比如:
ios::in | ios::binary; //以二進(jìn)制方式讀取文件
除此之外,還可以在構(gòu)造時(shí)指定相應(yīng)的文件路徑和名稱,讓創(chuàng)建過(guò)程一步到位。上述代碼可改寫為:
ifstream fin("C:\filename.txt");
與open方法相反的是close方法,它的作用與open正好相反。open是將文件流對(duì)象與外設(shè)中的文件關(guān)聯(lián)起來(lái),close則是解除二者的關(guān)聯(lián)。但是需要注意的是,close還起到清空緩存的作用。最好讓open方法與close方法成對(duì)出現(xiàn)。
創(chuàng)建并打開(kāi)一個(gè)文件流后,就能像操作標(biāo)準(zhǔn)I/O那樣使用流插入操作符(<<)與流提取操作符(>>)。對(duì)于輸入文件流來(lái)說(shuō),可以調(diào)用getline函數(shù)從文件流中讀取一整行數(shù)據(jù),這樣就可以讀入含有空格的字符串。
下面是一個(gè)例子,該例的作用是讀取一個(gè)STLA格式的文件。STL是一種常用快速成像文件格式,其格式非常簡(jiǎn)單,特別是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 <stdio.h>
#include <tchar.h>
//added
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
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 {
float normal[3];
float vertex[3][3];
};
int _tmain(int argc, _TCHAR* argv[])
{
if (argc < 2) {
printf("specify an input file!\n");
return 1;
}
ifstream in(argv[1]);
if (!in.is_open()) {
printf("fail to open file!\n");
return 1;
}
//var
vector<facet> solid;
string line;
string word;
//check format
getline(in, line);
if (line.find("solid") != 0) {
printf("wrong file format!\n");
in.close();
return 1;
}
while (getline(in, line)) {
if (line.find("facet normal") != string::npos) {
facet f;
//read normal
stringstream ns(line);
ns >> word; //eat "facet"
ns >> word; //eat "normal"
ns >> f.normal[0] >> f.normal[1] >> f.normal[2];
//read vertices
getline(in, line); //"outer loop"
for (int i = 0; i < 3; i++) {
getline(in, line);
stringstream vs(line);
vs >> word; //eat "vertex"
vs >> f.vertex[i][0] >> f.vertex[i][1] >> f.vertex[i][2];
}
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++) {
facet& f = solid[i];
printf("\nfacet %d:\nnormal = (%f, %f, %f)\n", \
i+1, f.normal[0], f.normal[1], f.normal[2]);
for (int j = 0; j < 3; j++) {
printf("vertex[%d] = (%f, %f, %f)\n", \
j+1, f.vertex[j][0], f.vertex[j][1], f.vertex[j][2]);
}
}
return 0;
}
測(cè)試文件為:
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
輸入結(jié)果為:
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 . . .
上一篇:教你5分鐘輕松搞定內(nèi)存字節(jié)對(duì)齊
欄 目:C語(yǔ)言
本文標(biāo)題:C++流操作之fstream用法介紹
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/4124.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10深入理解鏈表的各類操作詳解
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10用C語(yǔ)言實(shí)現(xiàn)單鏈表的各種操作(一)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子


