C++流操作之fstream用法引見。本站提示廣大學習愛好者:(C++流操作之fstream用法引見)文章只能為提供參考,不一定能成為您想要的結果。以下是C++流操作之fstream用法引見正文
在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 <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;
}
測試文件為:
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 . . .