導航:首頁 > 源碼編譯 > ofstream編譯系統

ofstream編譯系統

發布時間:2022-09-28 08:15:56

1. 輸入語句(如cin)在計算機內部是怎樣運行的

、 C++流的概念

在C++語言中,數據的輸入和輸出(簡寫為I/O)包括對標准輸入設備鍵盤和標准輸

出設備顯示器、對在外存磁碟上的文件和對內存中指定的字元串存儲空間(當然可

用該空間存儲任何信息)進行輸入輸出這三個方面。對標准輸入設備和標准輸出設

備的輸入輸出簡稱為標准I/O,對在外存磁碟上文件的輸入輸出簡稱為文件I/O,對

內存中指定的字元串存儲空間的輸入輸出簡稱為串I/O。
C++語言系統為實現數據的輸入和輸出定義了一個龐大的類庫,它包括的類主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrs

tream,strstream等,其中ios為根基類,其餘都是它的直接或間接派生類。

ios為根基類,它直接派生四個類:輸入流類istream、輸出流類ostream、文件流

基類fstreambase和字元串流基類strstreambase,輸入文件流類同時繼承了輸入流

類和文件流基類(當然對於根基類是間接繼承),輸出文件流類ofstream同時繼承了輸出流類和文件流基類,輸入字元串流類istrstream同時繼承了輸入流類和字元串流基類,輸出字元串流類ostrstream同時繼承了輸出流類和字元串流基類,輸入輸出流類iostream同時繼承了輸入流類和輸出流類,輸入輸出文件流類fstream同時繼承了輸入輸出流類和文件流基類,輸入輸出字元串流類strstream同時繼承了輸入輸出流類和字元串流基類。
「流」就是「流動」,是物質從一處向另一處流動的過程。C++流是指信息從外部輸入設備(如鍵盤和磁碟)向計算機內部(即內存)輸入和從內存向外部輸出設備(如顯示器和磁碟)輸出的過程,這種輸入輸出過程被形象地比喻為「流」。為了實現信息的內外流動,C++系統定義了I/O類庫,其中的每一個類都稱作相應的流或流類,用以完成某一方面的功能。根據一個流類定義的對象也時常被稱為流。如根據文件流類fstream定義的一個對象fio,可稱作為fio流或fio文件流,用它可以同磁碟上一個文件相聯系,實現對該文件的輸入和輸出,fio就等同於與之相聯系的文件。
C++系統中的I/O類庫,其所有類被包含在iostream.h,fstream.h和strstrea.h這三個系統頭文件中,各頭文件包含的類如下:
iostream.h包含有:ios, iostream, istream, ostream, iostream_withassign,
istream_withassign, ostream_withassign等。
fstream.h包含有:fstream, ifstream, ofstream和fstreambase,以及iostream.h
中的所有類。
Strstrea.h包含有:strstream, istrstream, ostrstream和strstreambase,以及
iostream.h中的所有類。
在一個程序或一個編譯單元(即一個程序文件)中當需要進行標准I/O操作時,則必須包含頭文件iostream.h,當需要進行文件I/O操作時,則必須包含頭文件fstream.h,同樣,當需要進行串I/O操作時,則必須包含頭文件strstrea.h。在一個程序或編譯單元中包含一個頭文件的命令格式為「#include<頭文件名>」,當然若頭文件是用戶建立的,則頭文件名的兩側不是使用尖括弧,而是使用雙引號。當系統編譯一個C++文件對#include命令進行處理時,是把該命令中指定的文件中的全部內容嵌入到該命令的位置,然後再編譯整個C++文件生成相應的目標代碼文件。
C++不僅定義有現成的I/O類庫供用戶使用,而且還為用戶進行標准I/O操作定義了四個類對象,它們分別是cin,cout,cerr和clog,其中cin為istream_withassign流類的對象,代表標准輸入設備鍵盤,也稱為cin流或標准輸入流,後三個為ostream_withassign流類的對象,cout代表標准輸出設備顯示器,也稱為cout流或標准輸出流,cerr和clog含義相同,均代表錯誤信息輸出設備顯示器。因此當進行鍵盤輸入時使用cin流,當進行顯示器輸出時使用cout流,當進行錯誤信息輸出時使用cerr或clog。
在istream輸入流類中定義有對右移操作符>>重載的一組公用成員函數,函數的具體聲明格式為:
istream& operator>>(簡單類型標識符&);
簡單類型標識符可以為char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, float, double, long double, char*, signed char*, unsigned char*之中的任何一種,對於每一種類型都對應著一個右移操作符重載函數。由於右移操作符重載用於給變數輸入數據的操作,所以又稱為提取操作符,即從流中提取出數據賦給變數。
當系統執行cin>>x操作時,將根據實參x的類型調用相應的提取操作符重載函數,把x引用傳送給對應的形參,接著從鍵盤的輸入中讀入一個值並賦給x(因形參是x的別名)後,返回cin流,以便繼續使用提取操作符為下一個變數輸入數據。
當從鍵盤上輸入數據時,只有當輸入完數據並按下回車鍵後,系統才把該行數據存入到鍵盤緩沖區,供cin流順序讀取給變數。還有,從鍵盤上輸入的每個數據之間必須用空格或回車符分開,因為cin為一個變數讀入數據時是以空格或回車符作為其結束標志的。
當cin>>x操作中的x為字元指針類型時,則要求從鍵盤的輸入中讀取一個字元串,並把它賦值給x所指向的存儲空間中,若x沒有事先指向一個允許寫入信息的存儲空間,則無法完成輸入操作。另外從鍵盤上輸入的字元串,其兩邊不能帶有雙引號定界符,若帶有隻作為雙引號字元看待。對於輸入的字元也是如此,不能帶有單引號定界符。
在ostream輸出流類中定義有對左移操作符<<重載的一組公用成員函數,函數的具體聲明格式為:
ostream& operator<<(簡單類型標識符);
簡單類型標識符除了與在istream流類中聲明右移操作符重載函數給出的所有簡單類型標識符相同以外,還增加一個void* 類型,用於輸出任何指針(但不能是字元指針,因為它將被作為字元串處理,即輸出所指向存儲空間中保存的一個字元串)的值。由於左移操作符重載用於向流中輸出表達式的值,所以又稱為插入操作符。如當輸出流是cout時,則就把表達式的值插入到顯示器上,即輸出到顯示器顯示出來。
當系統執行cout<<x操作時,首先根據x值的類型調用相應的插入操作符重載函數,把x的值按值傳送給對應的形參,接著執行函數體,把x的值(亦即形參的值)輸出到顯示器屏幕上,從當前屏幕游標位置起顯示出來,然後返回cout流,以便繼續使用插入操作符輸出下一個表達式的值。當使用插入操作符向一個流輸出一個值後,再輸出下一個值時將被緊接著放在上一個值的後面,所以為了讓流中前後兩個值分開,可以在輸出一個值之後接著輸出一個空格,或一個換行符,或其他所需要的字元或字元串。

二、 輸入輸出格式控制

1.ios類中的枚舉常量
在根基類ios中定義有三個用戶需要使用的枚舉類型,由於它們是在公用成員部分定義的,所以其中的每個枚舉類型常量在加上ios::前綴後都可以為本類成員函數和所有外部函數訪問。在三個枚舉類型中有一個無名枚舉類型,其中定義的每個枚舉常量都是用於設置控制輸入輸出格式的標志使用的。該枚舉類型定義如下:
enum {skipws, left, right, internal, dec, oct, hex, showbase,
showpoint, uppercase, showpos, scientific, fixed, unitbuf, stdio
};
各枚舉常量的含義如下:
skipws
利用它設置對應標志後,從流中輸入數據時跳過當前位置及後面的所有連續的空白字元,從第一個非空白字元起讀數,否則不跳過空白字元。空格、製表符』\t』、回車符』\r』和換行符』\n』統稱為空白符。預設為設置。
left, right, internal
left在指定的域寬內按左對齊輸出,right按右對齊輸出,而internal使數值的符號按左對齊、數值本身按右對齊輸出。域寬內剩餘的字元位置用填充符填充。預設為right設置。在任一時刻只有一種有效。
dec, oct, hex
設置dec對應標志後,使以後的數值按十進制輸出,設置oct後按八進制輸出,而設置hex後則按十六進制輸出。預設為dec設置。
showbase
設置對應標志後使數值輸出的前面加上「基指示符」,八進制數的基指示符為數字0,十六進制數的基指示符為0x,十進制數沒有基指示符。預設為不設置,即在數值輸出的前面不加基指示符。
showpoint
強制輸出的浮點數中帶有小數點和小數尾部的無效數字0。預設為不設置。
uppercase
使輸出的十六進制數和浮點數中使用的字母為大寫。預設為不設置。即輸出的十六進制數和浮點數中使用的字母為小寫。
showpos
使輸出的正數前帶有正號「+」。預設為不設置。即輸出的正數前不帶任何符號。
scientific, fixed
進行scientific設置後使浮點數按科學表示法輸出,進行fixed設置後使浮點數按定點表示法輸出。只能任設其一。預設時由系統根據輸出的數值選用合適的表示輸出。
unitbuf, stdio
這兩個常量很少使用,所以不予介紹。
在ios中定義的第二個枚舉類型為:
enum open_mode {in, out, ate, app, trunc, nocreate, noreplace, binany};
其中的每個枚舉常量規定一種文件打開的方式,在定義文件流對象和打開文件時使用。
在ios中定義的第三個枚舉類型為:
enum seek_dir {beg, cur, end};
其中的每個枚舉常量用於對文件指針的定位操作上。

2. ios類中的成員函數
ios類提供成員函數對流的狀態進行檢測和進行輸入輸出格式控制等操作,每個成員函數的聲明格式和簡要說明如下:
int bad(); //操作出錯時返回非0值。
int eof(); //讀取到流中最後的文件結束符時返回非0值。
int fail(); //操作失敗時返回非0值。
void clear(); //清除bad,eof和fail所對應的標志狀態,使之恢復為正常狀態
//值0,使good標志狀態恢復為1。
char fill(); //返回當前使用的填充字元。
char fill(char c); //重新設置流中用於輸出數據的填充字元為c的值,返回此
//前的填充字元。系統預設置填充字元為空格。
long flags(); //返回當前用於I/O控制的格式狀態字。
long flags(long f); //重新設置格式狀態字為f的值,返回此前的格式狀態字。
int good(); //操作正常時返回非0值,當操作出錯、失敗和讀到文件結束符時
//均為不正常,則返回0。
int precision(); //返回浮點數輸出精度,即輸出的有效數字的位數。
int precision(int n); //設置浮點數的輸出精度為n,返回此前的輸出精度。
//系統預設置的輸出精度為6,即輸出的浮點數最多
//具有6位為有效數字。
int rdstate(); //操作正常時返回0,否則返回非0值,它與good()正好相反。
long setf(long f); //根據參數f設置相應的格式化標志,返回此前的設置。
//該參數f所對應的實參為無名枚舉類型中的枚舉常量(
//又稱格式化常量),可以同時使用一個或多個常量,每兩個
//常量之間要用按位或操作符連接。如當需要左對齊輸出,
//並使數值中的字母大寫時,則調用該函數的實參為ios::
//left | ios::uppercase。
long unsetf(long f); //根據參數f清除相應的格式化標志,返回此前的設置。
//如要清除此前的左對齊輸出設置,恢復預設的右對齊輸出
//設置,則調用該函數的實參為ios::left。
int width(); //返回當前的輸出域寬。若返回數值0則表明沒有為剛才輸出的
//數值設置輸出域寬,輸出域寬是指輸出的值在流中所佔有的位元組數。
int width(int w); //設置下一個數據值的輸出域寬為w,返回為輸出上一個數
//據值所規定的域寬,若無規定則返回0。注意:此設置不
//是一直有效,而只是對下一個輸出數據有效。
因為所有I/O流類都是ios的派生類,所以它們的對象都可以調用ios類中的成員函數和使用ios類中的格式化常量進行輸入輸出格式控制。下面以標准輸出流對象cout為例說明輸出的格式化控制。
程序1:
#include<iostream.h>
void main()
{
int x=30, y=300, z=1024;
cout<<x<<' '<<y<<' '<<z<<endl; //按十進制輸出
cout.setf(ios::oct); //設置為八進制輸出
cout<<x<<' '<<y<<' '<<z<<endl; //按八進制輸出
cout.unsetf(ios::oct);
//取消八進制輸出設置,恢復按十進制輸出
cout.setf(ios::hex); //設置為十六進制輸出
cout<<x<<' '<<y<<' '<<z<<endl; //按十六進制輸出
cout.setf(ios::showbase | ios::uppercase);
//設置基指示符輸出和數值中的字母大寫輸出
cout<<x<<' '<<y<<' '<<z<<endl;
cout.unsetf(ios::showbase | ios::uppercase);
//取消基指示符輸出和數值中的字母大寫輸出
cout<<x<<' '<<y<<' '<<z<<endl;
cout.unsetf(ios::hex);
//取消十六進制輸出設置,恢復按十進制輸出
cout<<x<<' '<<y<<' '<<z<<endl;
}
此程序的運行結果如下:
30 300 1024
36 454 2000
1e 12c 400
0X1E 0X12C 0X400
1e 12c 400
30 300 1024

程序2:
#include<iostream.h>
void main()
{
int x=468;
double y=-3.425648;
cout<<"x=";
cout.width(10); //設置輸出下一個數據的域寬為10
cout<<x; //按預設的右對齊輸出,剩餘位置填充空格字元
cout<<"y=";
cout.width(10); //設置輸出下一個數據的域寬為10
cout<<y<<endl;
cout.setf(ios::left); //設置按左對齊輸出
cout<<"x=";
cout.width(10);
cout<<x;
cout<<"y=";
cout.width(10);
cout<<y<<endl;
cout.fill('*'); //設置填充字元為'*'
cout.precision(3); //設置浮點數輸出精度為3
cout.setf(ios::showpos); //設置正數的正號輸出
cout<<"x=";
cout.width(10);
cout<<x;
cout<<"y=";
cout.width(10);
cout<<y<<endl;
}
此程序運行結果如下:
x= 468y= -3.42565
x=468 y=-3.42565
x=+468******y=-3.43*****

程序3:
#include<iostream.h>
void main()
{
float x=25, y=-4.762;
cout<<x<<' '<<y<<endl;
cout.setf(ios::showpoint); //強制顯示小數點和無效0
cout<<x<<' '<<y<<endl;
cout.unsetf(ios::showpoint); //恢復預設輸出
cout.setf(ios::scientific); //設置按科學表示法輸出
cout<<x<<' '<<y<<endl;
cout.setf(ios::fixed); //設置按定點表示法輸出
cout<<x<<' '<<y<<endl;
}
程序運行結果如下:
25 -4.762
25.0000 -4.76200
2.500000e+001 -4.762000e+000
25 -4.762

3. 格式控制操作符
數據輸入輸出的格式控制還有更簡便的形式,就是使用系統頭文件iomanip.h中提供的操縱符。使用這些操縱符不需要調用成員函數,只要把它們作為插入操作符<<(個別作為提取操作符>>)的輸出對象即可。這些操縱符及功能如下:
dec //轉換為按十進制輸出整數,它也是系統預置的進制。
oct //轉換為按八進制輸出整數。
hex //轉換為按十六進制輸出整數。
ws //從輸入流中讀取空白字元。
endl //輸出換行符』\n』並刷新流。刷新流是指把流緩沖區的內容立即寫入到對
//應的物理設備上。
ends //輸出一個空字元』\0』。
flush //只刷新一個輸出流。
setiosflags(long f) //設置f所對應的格式化標志,功能與setf(long f)
//成員函數相同,當然輸出該操縱符後返回的是一個
//輸出流。如採用標准輸出流cout輸出它時,則返回
//cout。對於輸出每個操縱符後也都是如此,即返回
//輸出它的流,以便向流中繼續插入下一個數據。
resetiosflags(long f) //清除f所對應的格式化標志,功能與unsetf(long f)
//成員函數相同。當然輸出後返回一個流。
setfill(int c) //設置填充字元為ASCII碼為c的字元。
setprecision(int n) //設置浮點數的輸出精度為n。
setw(int w) //設置下一個數據的輸出域寬為w。
在上面的操縱符中,dec, oce, hex, endl, ends, flush和ws除了在iomanip.h中有定義外,在iostream.h中也有定義。所以當程序或編譯單元中只需要使用這些不帶參數的操縱符時,可以只包含iostream.h文件,而不需要包含iomanip.h文件。
下面以標准輸出流對象cout為例,說明使用操作符進行的輸出格式化控制。
程序4:
#include<iostream.h>
//因iomanip.h中包含有iostream.h,所以該命令可省略
#include<iomanip.h>
void main()
{
int x=30, y=300, z=1024;
cout<<x<<' '<<y<<' '<<z<<endl; //按十進制輸出
cout<<oct<<x<<' '<<y<<' '<<z<<endl; //按八進制輸出
cout<<hex<<x<<' '<<y<<' '<<z<<endl; //按十六進制輸出
cout<<setiosflags(ios::showbase | ios::uppercase);
//設置基指示符和數值中的字母大寫輸出
cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六進制輸出
cout<<resetiosflags(ios::showbase | ios::uppercase);
//取消基指示符和數值中的字母大寫輸出
cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六進制輸出
cout<<dec<<x<<' '<<y<<' '<<z<<endl; //按十進制輸出
}
此程序的功能和運行結果都與程序1完全相同。

程序5:
#include<iostream.h>
#include<iomanip.h>
void main()
{
int x=468;
double y=-3.425648;
cout<<"x="<<setw(10)<<x;
cout<<"y="<<setw(10)<<y<<endl;
cout<<setiosflags(ios::left); //設置按左對齊輸出
cout<<"x="<<setw(10)<<x;
cout<<"y="<<setw(10)<<y<<endl;
cout<<setfill('*'); //設置填充字元為'*'
cout<<setprecision(3); //設置浮點數輸出精度為3
cout<<setiosflags(ios::showpos); //設置正數的正號輸出
cout<<"x="<<setw(10)<<x;
cout<<"y="<<setw(10)<<y<<endl;
cout<<resetiosflags(ios::left | ios::showpos);
cout<<setfill(' ');
}
此程序的功能和運行結果完全與程序2相同。

程序6:
#include<iomanip.h>
void main()
{
float x=25, y=-4.762;
cout<<x<<' '<<y<<endl;
cout<<setiosflags(ios::showpoint);
cout<<x<<' '<<y<<endl;
cout<<resetiosflags(ios::showpoint);
cout<<setiosflags(ios::scientific);
cout<<x<<' '<<y<<endl;
cout<<setiosflags(ios::fixed);
cout<<x<<' '<<y<<endl;
}
此程序的功能和運行結果也完全與程序3相同。

三、文件操作

1. 文件的概念
以前進行的輸入輸出操作都是在鍵盤和顯示器上進行的,通過鍵盤向程序輸入待處理的數據,通過顯示器輸出程序運行過程中需要告訴用戶的信息。鍵盤是C++系統中的標准輸入設備,用cin流表示,顯示器是C++系統中的標准輸出設備,用cout流表示。
數據的輸入和輸出除了可以在鍵盤和顯示器上進行之外,還可以在磁碟上進行。磁碟是外部存儲器,它能夠永久保存信息,並能夠被重新讀寫和攜帶使用。所以若用戶需要把信息保存起來,以便下次使用,則必須把它存儲到外存磁碟上。
在磁碟上保存的信息是按文件的形式組織的,每個文件都對應一個文件名,並且屬於某個物理盤或邏輯盤的目錄層次結構中一個確定的目錄之下。一個文件名由文件主名和擴展名兩部分組成,它們之間用圓點(即小數點)分開,擴展名可以省略,當省略時也要省略掉前面的圓點。文件主名是由用戶命名的一個有效的C++標識符,為了同其他軟體系統兼容,一般讓文件主名為不超過8個有效字元的標識符,同時為了便於記憶和使用,最好使文件主名的含義與所存的文件內容相一致。文件擴展名也是由用戶命名的、1至3個字元組成的、有效的C++標識符,通常用它來區分文件的類型。如在C++系統中,用擴展名h表示頭文件,用擴展名cpp表示程序文件,用obj表示程序文件被編譯後生成的目標文件,用exe表示連接整個程序中所有目標文件後生成的可執行文件。對於用戶建立的用於保存數據的文件,通常用dat表示擴展名,若它是由字元構成的文本文件則也用txt作為擴展名,若它是由位元組構成的、能夠進行隨機存取的內部格式文件則可用ran表示擴展名。
在C++程序中使用的保存數據的文件按存儲格式分為兩種類型,一種為字元格式文件,簡稱字元文件,另一種為內部格式文件,簡稱位元組文件。字元文件又稱ASCII碼文件或文本文件,位元組文件又稱二進制文件。在字元文件中,每個位元組單元的內容為字元的ASCII碼,被讀出後能夠直接送到顯示器或列印機上顯示或列印出對應的字元,供人們直接閱讀。在位元組文件中,文件內容是數據的內部表示,是從內存中直接復制過來的。當然對於字元信息,數據的內部表示就是ASCII碼表示,所以在字元文件和在位元組文件中保存的字元信息沒有差別,但對於數值信息,數據的內部表示和ASCII碼表示截然不同,所以在字元文件和在位元組文件中保存的數值信息也截然不同。如對於一個短整型數1069,它的內部表示佔有兩個位元組,對應的十六進制編碼為04 2D,其中04為高位元組值,2D為低位元組值;若用ASCII碼表示則為四個位元組,每個位元組依次為1069中每個字元的ASCII碼,對應的十六進制編碼為31 30 36 39。當從內存向字元文件輸出數值數據時需要自動轉換成它的ASCII碼表示,相反,當從字元文件向內存輸入數值數據時也需要自動將它轉換為內部表示,而對於位元組文件的輸入輸出則不需要轉換,僅是內外存信息的直接拷貝,顯然比字元文件的輸入輸出要快得多。所以當建立的文件主要是為了進行數據處理時,則適宜建立成位元組文件,若主要是為了輸出到顯示器或列印機供人們閱讀,或者是為了供其他軟體使用時,則適宜建立成字元文件。另外,當向字元文件輸出一個換行符』\n』時,則將被看作為輸出了回車』\r』和換行』\n』兩個字元;相反,當從字元文件中讀取回車和換行兩個連續字元時,也被看作為一個換行符讀取。
C++程序文件,利用其他各種語言編寫的程序文件,用戶建立的各種文本文件,各種軟體系統中的幫助文件等,因都是ASCII碼文件,所以都可以在C++中作為字元文件使用。
C

2. C++文件流的C++ 中 *fstream 操作

在fstream類中,有一個成員函數open(),就是用來打開文件的,其原型是: voidopen(constchar*filename,intmode,intaccess);參數: 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
// 註:新的C++標准庫不支持nocreate和noreplace,以前的舊版本可以用.
打開文件的屬性取值是: 0:普通文件,打開訪問1:只讀文件2:隱含文件4:系統文件可以用「或」或者「+」把以上屬性連接起來 ,如3或1|2就是以只讀和隱含屬性打開文件。
例如:以二進制輸入方式打開文件c:config.sys fstreamfile1;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()一樣的構造函數,對於上例,在定義的時候就可以打開文件了: fstreamfile1(c:config.sys);特別提出的是,fstream有兩個子類:ifstream(input file stream)和ofstream(output file stream),ifstream默認以輸入方式打開文件,而ofstream默認以輸出方式打開文件。 ifstreamfile2(c:pdos.def);//以輸入方式打開文件ofstreamfile3(c:x.123);//以輸出方式打開文件所以,在實際應用中,根據需要的不同,選擇不同的類來定義:如果想以輸入方式打開,就用ifstream來定義;如果想以輸出方式打開,就用ofstream來定義;如果想以輸入/輸出方式來打開,就用fstream來定義。
包含:
需要在文件中包含<fstream>,即: #include<fstream>後面可以加using namespace std;程序里就可以直接用fstream類及其函數了。
或者在具體使用時用std::來標識,如:std::fstream file1;
例如:fstream file; file.open(filename.txt,ios::out); 讀寫文件分為文本文件和二進制文件的讀取,對於文本文件的讀取比較簡單,用插入器和析取器就可以了;而對於二進制的讀取就要復雜些,下面就詳細的介紹這兩種方式
1、文本文件的讀寫
文本文件的讀寫很簡單:用插入器(<<)向文件輸出;用析取器(>>)從文件輸入。假設file1是以輸入方式打開,file2以輸出打開。示例如下:
file2<<I Love You;//向文件寫入字元串I Love You
int i;
file1>>i;//從文件輸入一個整數值。
這種方式還有一種簡單的格式化能力,比如可以指定輸出為16進制等等,具體的格式有以下一些
操縱符 功能 輸入/輸出 dec格式化為十進制數值數據輸入和輸出endl輸出一個換行符並刷新此流輸出ends輸出一個空字元輸出hex格式化為十六進制數值數據輸入和輸出oct格式化為八進制數值數據輸入和輸出//setpxecision(intp)設置浮點數的精度位數輸出setprecision(intp)設置浮點數的精度位數輸出(setpxecision應該為setprecision,使用時需要包含頭文件:#include <iomanip.h>)
//比如要把123當作十六進制輸出:file1<<hex<<123;要把3.1415926以5位精度輸出:file1<<setprecision(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 *,有時可能需要類型轉換。
例: unsignedcharstr1[]=ILoveYou;intn[5];ifstreamin(xxx.xxx);ofstreamout(yyy.yyy);out.write(str1,strlen(str1));//把字元串str1全部寫到yyy.yyy中in.read((unsignedchar*)n,sizeof(n));//從xxx.xxx中讀取指定個整數,注意類型轉換in.close();out.close(); iostatevalue(member
constant) indicatesfunctions to
check state
flags good()eof()fail()bad()rdstate()goodbitNo errors (zero valueiostate)-of-File reached on input error on i/o /writing error on i/o
operation falsefalsetruetruebadbit 成員函數eof()用來檢測是否到達文件尾,如果到達文件尾返回非0值,否則返回0。原型是int eof();
例: if(in.eof())ShowMessage(已經到達文件尾!);
出現eof標志如果用clear(),eof標志會被清除,這時需要手動檢查或在下一次操作時重新置位
手動檢查 autolastpos=in,tellg();in.seekg(0,ios::end);autoendpos=in.tellg();in.seekg(lastpos); 和C的文件操作方式不同的是,C++ I/O系統管理兩個與一個文件相聯系的指針。一個是讀指針,它說明輸入操作在文件中的位置;另一個是寫指針,它下次寫操作的位置。每次執行輸入或輸出時,相應的指針自動變化。所以,C++的文件定位分為讀位置和寫位置的定位,對應的成員函數是 seekg()和 seekp(),seekg()是設置讀位置,seekp是設置寫位置。
使用seekg和seekp時移動的是同一個指針,可以通過下面程序檢測 fstreamfile;//需要保證文件一定打開成功file.open(1.txt,ios::binary|ios::trunc|ios::in|ios::out);file.write(ABCDEFGHIJ,10);//寫指針應該是10printf(%u ,(size_t)file.tellp());//設置讀指針為0file.seekg(0,ios::beg);//可以發現寫指針變成0了printf(%u ,(size_t)file.tellp());seekg()和seekp()返回的流尚未研究,尚不清楚與本體的關系,需後來人補充tellp或tellg()返回的值不能直接使用,必須轉換為C++基本值 size_tpos1=file.tellg().seekpos();//或size_tpos2=(size_t)file.tellg();它們最通用的形式如下: istream&seekg(streamoffoffset,seek_dirorigin);ostream&seekp(streamoffoffset,seek_dirorigin);streamoff定義於 iostream.h 中,定義有偏移量 offset 所能取得的最大值,seek_dir 表示移動的基準位置,是一個有以下值的枚舉: ios::beg:文件開頭ios::cur:文件當前位置ios::end:文件結尾這兩個函數一般用於二進制文件,因為文本文件會因為系統對字元的解釋而可能與預想的值不同。
例: file1.seekg(1234,ios::cur);//把文件的讀指針從當前位置向後移1234個位元組file2.seekp(1234,ios::beg);//把文件的寫指針從文件開頭向後移1234個位元組如果vc編程的話最好使用CFile類等更加方便於文件操作</CA> stream的聲明裡面是將拷貝構造函數聲明為非public的,應此在將stream作為函數參數傳遞時應該使用引用或者指針,而非值傳遞。
例如: voidfn(streamin);這樣的聲明在編譯時無問題,但是在使用時即會提示錯誤,應該修改為 voidfn(stream&in);

3. c++ 關於ofstream,急急在線等,十分著急,就剩這些分數,全給了

#include <iostream>
#include <fstream>
using namespace std;

應該放在"huffman.h"文件
在main()函數的文件中就加這個"huffman.h"頭文件

4. ofstream 幫幫忙,這個編譯時可以,可是運行時就說是內存不足,怎麼回事啊

char* 的初始化,這里的問題:

name=NULL;
sex=NULL;

改為
name="";
sex="";

或者

name="\0";
sex="\0";

5. ofstream應該如何構造

你沒有加頭文件
#include <fstream>

6. 請問能否在C++中定義一個ofstream的全局變數以在所有cpp文件中都能使用同一個

這個標準的做法是先做一個.h文件(如my_ext.h),在.h中聲明一個全局的外部變數externofstreammy_ofstream;然後在一個.cpp中定義它(如my_ext.cpp)ofstreammy_ofstream;最後在你要用的.cpp中,include自己寫的頭文件,並將my_ext.cpp加入你的工程這樣就可以了如果你要像系統的函數或變數一樣,所有的.cpp都能使用,只要加個include那你就需要做一個靜態庫了(各個編譯器的方法各不相同)

7. c++ifstream對象初學問題 void begin(ofstream &fl){······};

把所有的代碼都打出來吧

8. C++裡面的iostream是什麼東西

C++編譯系統提供了用於輸入輸出的iostream類庫。iostream這個單詞是由3個部分組成的,即i-o-stream,意為輸入輸出流。在iostream類庫中包含許多用於輸入輸出的類。

ios是抽象基類,由他派生出istream類和ostream類,兩個類名中第一個字母i和o分別代表輸入(input)和輸出(output)。isrream類支持輸入操作,ostream類支持輸出操作,iostream支持輸入輸出操作。iostream是從istreanm類和ostream類通過多重繼承而派生的類。


C++對文件的輸入輸出需要用ifstream和ofstream類,兩個類名中第一個字母i和o分別代表輸入輸出,第二個字母f代表文件(file)。ifstream支持對文件的輸入操作,ofstream支持對文件的輸出操作。類ifstream繼承了istream,類ofstream繼承了ostream,類fstream繼承了iostream。


#include<iostream>的意思提供iostream庫中的信息,在程序開頭寫上這個才可以直接調用iostream類庫中的函數

9. C++ ofstream對象打開是否成功的判斷

qqq應該是個指針(以下都是個人推測)
如果打開文件成功,則qqq是一個指向該文件的指針,其值不會是0
如果打開文件失敗,則qqq會是NULL,從數值上來說,就是個0
false從數值上來說表示0 true表示1
所以,qqq==false沒錯,qqq==true卻會報錯 C++編譯器就是這樣設計的。不要管為什麼了。一定要學會正確使用就可以了。

閱讀全文

與ofstream編譯系統相關的資料

熱點內容
程序員用得到數字區嗎 瀏覽:174
python求商 瀏覽:477
ipad能用c語言編譯器嗎 瀏覽:561
軟泥解壓球最新版 瀏覽:998
4萬程序員辭職創業 瀏覽:759
thinkingphp 瀏覽:597
安卓相冊移動文件夾 瀏覽:6
耳朵清潔解壓聲控99的人都睡得著 瀏覽:205
叉車出租網站源碼 瀏覽:874
共享單車的app是什麼 瀏覽:408
不帶gui的伺服器什麼意思 瀏覽:373
金剛經及PDF 瀏覽:102
php中冒號 瀏覽:358
php5432 瀏覽:352
命令在哪使用 瀏覽:172
php獲取網頁元素 瀏覽:708
為什麼需要硬體驅動編譯 瀏覽:885
pm編程怎樣看導柱孔對不對稱 瀏覽:138
農業大學選課找不到伺服器怎麼辦 瀏覽:659
路由配置網關命令 瀏覽:935