1. 程式人生 > >VC\c++ 對文字檔案讀寫方法(sys,txt)

VC\c++ 對文字檔案讀寫方法(sys,txt)

ofstream是從記憶體到硬碟,ifstream是從硬碟到記憶體,其實所謂的流緩衝就是記憶體空間;

在C++中,有一個stream這個類,所有的I/O都以這個“流”類為基礎的,包括我們要認識的檔案I/O,stream這個類有兩個重要的運算子:

1、插入器(< < )
  向流輸出資料。比如說系統有一個預設的標準輸出流(cout),一般情況下就是指的顯示器,所以,cout< < " Write Stdout" < < '\n'; 就表示把字串" Write Stdout" 和換行字元('\n')輸出到標準輸出流。

2、析取器(> > )
  從流中輸入資料。比如說系統有一個預設的標準輸入流(cin),一般情況下就是指的鍵盤,所以,cin> > x; 就表示從標準輸入流中讀取一個指定型別(即變數x的型別)的資料。

  在C++中,對檔案的操作是通過stream的子類fstream(file stream)來實現的,所以,要用這種方式操作檔案,就必須加入標頭檔案fstream.h。下面就把此類的檔案操作過程一一道來。

一、開啟檔案
  在fstream類中,有一個成員函式open(),就是用來開啟檔案的,其原型是:

void open(const char* filename,int mode,int access);

引數:

filename:  要開啟的檔名
mode:    要開啟檔案的方式
access:   開啟檔案的屬性
開啟檔案的方式在類ios(是所有流式I/O類的基類)中定義,常用的值如下:

ios::app:   以追加的方式開啟檔案
ios::ate:   檔案開啟後定位到檔案尾,ios:app就包含有此屬性
ios::binary:  以二進位制方式開啟檔案,預設的方式是文字方式。兩種方式的區別見前文
ios::in:    檔案以輸入方式開啟(檔案資料輸入到記憶體)
ios::out:   檔案以輸出方式開啟(記憶體資料輸出到檔案)
ios::nocreate: 不建立檔案,所以檔案不存在時開啟失敗
ios::noreplace:不覆蓋檔案,所以開啟檔案時如果檔案存在失敗
ios::trunc:  如果檔案存在,把檔案長度設為0
  可以用“或”把以上屬性連線起來,如ios::out|ios::binary

  開啟檔案的屬性取值是:

0:普通檔案,開啟訪問
1:只讀檔案
2:隱含檔案
4:系統檔案
  可以用“或”或者“+”把以上屬性連線起來 ,如3或1|2就是以只讀和隱含屬性開啟檔案。

  例如:以二進位制輸入方式開啟檔案c:\config.sys
fstream file1;
file1.open(" c:\\config.sys" ,ios::binary|ios::in,0);

  如果open函式只有檔名一個引數,則是以讀/寫普通檔案開啟,即:
file1.open(" c:\\config.sys" ); < => file1.open(" c:\\config.sys" ,ios::in|ios::out,0);

  另外,fstream還有和open()一樣的建構函式,對於上例,在定義的時侯就可以開啟檔案了:
fstream file1(" c:\\config.sys" );

  特別提出的是,fstream有兩個子類:ifstream(input file stream)和ofstream(outpu file stream),ifstream預設以輸入方式開啟檔案,而ofstream預設以輸出方式開啟檔案。
ifstream file2(" c:\\pdos.def" ); //以輸入方式開啟檔案
ofstream file3(" c:\\x.123" ); //以輸出方式開啟檔案

  所以,在實際應用中,根據需要的不同,選擇不同的類來定義:如果想以輸入方式開啟,就用ifstream來定義;如果想以輸出方式開啟,就用ofstream來定義;如果想以輸入/輸出方式來開啟,就用fstream來定義。

二、關閉檔案
  開啟的檔案使用完成後一定要關閉,fstream提供了成員函式close()來完成此操作,如:file1.close(); 就把file1相連的檔案關閉。

三、讀寫檔案
  讀寫檔案分為文字檔案和二進位制檔案的讀取,對於文字檔案的讀取比較簡單,用插入器和析取器就可以了;而對於二進位制的讀取就要複雜些,下要就詳細的介紹這兩種方式

  1、文字檔案的讀寫
  文字檔案的讀寫很簡單:用插入器(< < )向檔案輸出;用析取器(> > )從檔案輸入。假設file1是以輸入方式開啟,file2以輸出開啟。示例如下:

  file2< < " I Love You" ; //向檔案寫入字串" I Love You"
  int i;
  file1> > i; //從檔案輸入一個整數值。

  這種方式還有一種簡單的格式化能力,比如可以指定輸出為16進位制等等,具體的格式有以下一些

操縱符 功能 輸入/輸出
dec 格式化為十進位制數值資料 輸入和輸出
endl 輸出一個換行符並重新整理此流 輸出
ends 輸出一個空字元 輸出
hex 格式化為十六進位制數值資料 輸入和輸出
oct 格式化為八進位制數值資料 輸入和輸出
setpxecision(int p) 設定浮點數的精度位數 輸出

  比如要把123當作十六進位制輸出:file1< < hex< < 123; 要把3.1415926以5位精度輸出:file1< < setpxecision(5)< < 3.1415926。

  2、二進位制檔案的讀寫
①put()
  put()函式向流寫入一個字元,其原型是ofstream &put(char ch),使用也比較簡單,如file1.put('c'); 就是向流寫一個字元'c'。

②get()
  get()函式比較靈活,有3種常用的過載形式:

  一種就是和put()對應的形式:ifstream &get(char & ch); 功能是從流中讀取一個字元,結果儲存在引用ch中,如果到檔案尾,返回空字元。如file2.get(x); 表示從檔案中讀取一個字元,並把讀取的字元儲存在x中。

  另一種過載形式的原型是: int get(); 這種形式是從流中返回一個字元,如果到達檔案尾,返回EOF,如x=file2.get(); 和上例功能是一樣的。

  還有一種形式的原型是:ifstream &get(char *buf,int num,char delim='\n');這種形式把字元讀入由 buf 指向的陣列,直到讀入了 num 個字元或遇到了由 delim 指定的字元,如果沒使用 delim 這個引數,將使用預設值換行符'\n'。例如:

  file2.get(str1,127,'A');     //從檔案中讀取字元到字串str1,當遇到字元'A'或讀取了127個字元時終止。

③讀寫資料塊
  要讀寫二進位制資料塊,使用成員函式read()和write()成員函式,它們原型如下:

    read(unsigned char *buf,int num);
    write(const unsigned char *buf,int num);

  read()從檔案中讀取 num 個字元到 buf 指向的快取中,如果在還未讀入 num 個字元時就到了檔案尾,可以用成員函式 int gcount(); 來取得實際讀取的字元數;而 write() 從buf 指向的快取寫 num 個字元到檔案中,值得注意的是快取的型別是 unsigned char *,有時可能需要型別轉換。

例:

    unsigned char str1[]=" I Love You" ;
    int n[5];
    ifstream in(" xxx.xxx" );
    ofstream out(" yyy.yyy" );
    out.write(str1,strlen(str1)); //把字串str1全部寫到yyy.yyy中
    in.read((unsigned char*)n,sizeof(n)); //從xxx.xxx中讀取指定個整數,注意型別轉換
    in.close(); out.close();

四、檢測EOF
  成員函式eof()用來檢測是否到達檔案尾,如果到達檔案尾返回非0值,否則返回0。原型是int eof();

例:  if(in.eof())    ShowMessage(" 已經到達檔案尾!" );

五、檔案定位
  和C的檔案操作方式不同的是,C++ I/O系統管理兩個與一個檔案相聯絡的指標。一個是讀指標,它說明輸入操作在檔案中的位置;另一個是寫指標,它下次寫操作的位置。每次執行輸入或輸出時,相應的指標自動變化。所以,C++的檔案定位分為讀位置和寫位置的定位,對應的成員函式是seekg()和seekp()。seekg()是設定讀位置,seekp是設定寫位置。它們最通用的形式如下:

    istream &seekg(streamoff offset,seek_dir origin);
    ostream & seekp(streamoff offset,seek_dir origin);

  streamoff定義於 iostream.h 中,定義有偏移量 offset 所能取得的最大值,seek_dir 表示移動的基準位置,是一個有以下值的列舉:

ios::beg:  檔案開頭
ios::cur:  檔案當前位置
ios::end:  檔案結尾

  這兩個函式一般用於二進位制檔案,因為文字檔案會因為系統對字元的解釋而可能與預想的值不同。例:

   file1.seekg(1234,ios::cur);     //把檔案的讀指標從當前位置向後移1234個位元組
   file2.seekp(1234,ios::beg);     //把檔案的寫指標從檔案開頭向後移1234個位元組

iostream庫不僅支援終端裝置的輸入輸出,還支援檔案的輸入輸出,和檔案有關的輸入輸出類宣告在fstream標頭檔案中,有三個類負責檔案的輸入輸出

1) ifstream類:從istream類派生。
2) ofstream類:從ostream類派生。
3) fstream類:從iostream類派生。

由於檔案的輸入輸出和鍵盤滑鼠的輸入輸出是不一樣的,一般pc機只有一個鍵盤裝置,所以iostream庫內部聲明瞭一個istream類的物件cin,這個物件負責從鍵盤獲取資料,而檔案裝置在系統中是由許多的,所以iostream庫內部無法給你為機器的每個檔案都建立一個負責獲取資料的ifstream物件和負責寫入資料的ofstream物件,所以我們要針對一個檔案進行讀取或寫入資料的時候都要自己建立一個ifstream或ostream類的物件來用。

ofstream類的預設建構函式如下:

ofstream::ofstream(constchar* filename, int mode = ios::out, int openport = filebuf::openport);

filename是要開啟的檔名,
mode是開啟的方式,
openport是開啟檔案的屬性。

mode可以設定的方式如下:
ios::app        以追加的方式開啟
ios::ate        檔案開啟後定位到檔案尾
ios::binary    以二進位制方式開啟檔案,預設是以文字方式開啟
ios::in          檔案以讀(輸入)方式開啟
ios::out        檔案以寫(輸出)方式開啟
ios::trunc     如果檔案存在,則把檔案清空。
以上屬性用“|”(按位或)連線起來。

openprot屬性如下:
0    普通檔案
1    只讀檔案
2    隱含檔案
4    系統檔案
以上屬性可以用加或者按位或方式組織起來,比如1|2和3都代表既是隻讀又是隱含檔案。

在windows作業系統中可以不要第三個引數,如果加入第三個引數,那第三個引數是開啟檔案的共享方式,也就是開啟這個檔案時,其他程序是否可以讀寫該檔案。
共享方式引數可以是下面的值:
0x10                   //_SH_DENYRW   Denies   read   and   write   access   to   the   file
0x20                   //_SH_DENYWR   Denies   write   access   to   the   file
0x30                   //_SH_DENYRD   Denies   read   access   to   the   file.
0x40                   //_SH_DENYNO   Permits   read   and   write   access  
其他值都會報 "Invalid   sharing   flag "的錯誤。

    ofstream hFile("c:\\1.txt", ios::out, _SH_DENYRW); // _SH_DENYRW is deny read and write
   
   
if (!hFile) // if the file could open, hFile is a handle, else is zero
{
        cout
<<"write fail!"<< endl;
        cout
<<"access is denies,maybe the file is readonlys,or use deny read opened of other process."<< endl;
    }

   
else
   
{
        hFile
<<"by coderlee writes";
        cout
<<"write success!"<< endl;
    }

    hFile.close();
// opened file need close.

上面是寫檔案的事例程式碼,先開啟檔案,然後判斷是不是0,如果是0,則提示write fail否則寫檔案,提示write success.

本文來自網上轉載,真誠感謝原創者!!!

相關推薦

VC\c++ 文字檔案方法(sys,txt)

ofstream是從記憶體到硬碟,ifstream是從硬碟到記憶體,其實所謂的流緩衝就是記憶體空間; 在C++中,有一個stream這個類,所有的I/O都以這個“流”類為基礎的,包括我們要認識的檔案I/O,stream這個類有兩個重要的運算子: 1、插入器(<

C# 文字檔案的幾種方法總結

計算機在最初只支援ASCII編碼,但是後來為了支援其他語言中的字元(比如漢字)以及一些特殊字元(比如€),就引入了Unicode字符集。基於Unicode字符集的編碼方式有很多,比如UTF-7、UTF-8、Unicode以及UTF-32。在Windows作業系統中,一個文

利用標準C語言庫函式進行文字檔案

    利用C語言進行檔案操作的方法有多種。其中包括在UNIX系統環境下利用系統介面進行檔案操作;在windows系統下可以利用windows系統下可以利用fopen_s等庫函式的安全版本進行檔案操作。但是用的最多的就是利用標準庫函式進行檔案操作。本文主要介紹利用C標準庫函

關於c++文件的封裝

hfile value val style urn 兩種 pat pos write 1 namespace 2 { 3 UINT_T GetWriteSizeForNoBuf(UINT_T fsize) 4 { 5

Python基本語法之文字檔案

  檔案讀寫相關係統函式說明 系統函式 說明 input(tips); 提示使用者輸入資訊,例如 str = input("Please input your ip:") 將輸入的資訊賦值給變數

Pythoncsv檔案操作

 包括使用csv模組進行檔案讀寫,使用requests模組進行檔案傳送。 def pay_task_by_self(self): global success_writer, fail_writer, cont dir_path = os.path.dirname(_

Python進階02 文字檔案

# 寫入 f = open("D:\\record.txt", 'w') f.write('tom, 12, 86\n') f.write('Lee, 15, 99\n') f.write('Lucy, 11, 58\n') f.write('Joseph, 19, 56') f.close()

C語言常用檔案函式記錄

由於在vs下開發,經常使用MFC的類庫,檔案讀寫也是CFile的類級派生類,現在此記錄C語言檔案操作常用api,以備不時之需。 (1)fopen,fclose – 檔案開啟關閉函式; FILE* pFile = fopen("test.txt","w"); 第一個引數是

MFC中的檔案方法總結

CStdioFile繼承自CFile,一個CStdioFile 物件代表一個用執行時函式fopen 開啟的C 執行時流檔案。       流式檔案是被緩衝的,而且可以以文字方式(預設)或二進位制方式開啟。文字方式提供對硬回車—換行符對的特殊處理。當你將一個換行符(0x0A)寫入一個文字方式的CStdioFi

Unity下關於C#的檔案一(基於TXT的簡單)

Unity下關於C#的檔案讀寫(基於TXT和LitJson) NOTE (基本認識):其實.txt,.xml,.json這類檔案都屬於文字檔案,類似的還有.lrc歌詞檔案,.ini配置檔案,.reg登錄檔檔案等等,這類檔案所儲存的內容都是文字(即為字串),

c#csv的

public class CSVFileHelper {     /// <summary>     /// 將DataTable中資料寫入到CSV檔案中     /// </summary>     /// <param name="dt"&

C++ 的各種檔案操作總結 [轉載]

在程式設計的過程中,檔案的操作是一個經常用到的問題,在C++Builder中,可以使用多種方法對檔案操作,下面我就按以下幾個部分對此作詳細介紹,就是: 1、基於C的檔案操作; 2、基於C++的檔案操作; 3、基於WINAPI的檔案操作; 4、基於BCB庫的檔案操作; 5、特殊檔案的操作。 壹、基於C的檔案

黑馬程式設計師——C語言基礎——檔案實戰

今天覆習的是C語言中另一塊比較重要的部分,檔案的讀寫操作。 在複習過後,還是以一道程式設計題來鞏固一下今天的學習成果: 檔案的讀寫操作程式設計實戰:         1.編寫一個函式,執行後可以錄入一句話(字串又使用者輸入)。         2.在每次輸入儲存後,

Java文字檔案

String filePath = new File("").getAbsolutePath() + "/src/file/" + "waitUse" + ".txt"; Fil

C#讀取文字檔案文字檔案

今天一個學生問我如何從一個文字中讀取內容,如下是做的是控制檯中的例子,在別的地方也是這個道理。        // 讀操作        public static void Read()        {            // 讀取檔案的源路徑及其讀取流            string strRe

C# FileStream流檔案

//C#檔案流寫檔案,預設追加FileMode.Append             string msg = "okffffffffffffffff";            byte[] myByte = System.Text.Encoding.UTF8.GetBy

I/O 簡單文字檔案改 物件 ArrayList儲存檔案的記錄

建立一個類TextFile ,繼承ArrayList 類      哪麼TextFile 擁有ArrayList public類成員資料和方法。目的:1、用ArrayList物件儲存從文字檔案中讀出的記錄         2、可以用ArrayList類裡面的所有的方法對檔案中

C語言之檔案——fscanf(),fprintf()詳解

1.fscanf():從檔案指標fp指向的檔案中,按format中對應的控制格式讀取資料,並存儲在agars對應的變數中; 原型: fscanf(FILE *fp, const char *forma

使用C#Excel進行操作(NPOI)以及使用EFMysql進行CURD

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

C#使用FileStream檔案

最近學習C#的過程中,要讀寫檔案,自己使用FileStream類寫了以下小段程式碼,一來自己學習練手,二來將這段程式碼貼出來,供想學習C#的朋友學習。 一.C# 程式碼 using System; using System.Collections.Generic; usi