程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++流操作之fstream用法引見

C++流操作之fstream用法引見

編輯:關於C++

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 . . . 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved