日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++的文件输入/输出

發布時間:2023/12/4 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++的文件输入/输出 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1文件的概述

根據文件中數據的組織形式分為:
1 文本文件
文本文件又稱ASCII文件,它的每一個字節存放一個ASCII代碼,代表一個字符
輸出文本:接收從內存輸出的數據
輸出文件,向它寫入數據 ofstream fout;
輸入文件,向它讀取數據 ifstream fin;

2二進制文件
二進制文件則是把內存中的 數據,按其在內存中的存儲形式原樣寫到磁盤上存放

問題
假定有一個整數10000,
(1)按文本形式輸出到磁盤上,需要占多少個字節?
答案:需要占5個字節
(2)按二進制形式輸出到磁盤上有需要占多少個字節?
答案:需要占2個字節
特點
用文本形式輸出時,一個字節對應一個字符,因而便于對字符進行逐個處理,也便于輸出字符,缺點是占存儲空間比較多。
用二進制形式輸出數據,可以節省存儲空間 和轉換時間,但一個字節 不能對應一個字符,不能直接以字符形式輸出。
對于需要暫時保存到外存上,以后有需要輸入到內存的中間結果數據,通常以二進制保存。

在c++中進行文件操作的一般步驟如下:
(1)為要進行操作的文件定義一個流對象。
(2)建立或打開文件。如果文件不存在,則建立改文件。如果磁盤上已有該文件,則打開它。
(3)進行文件的讀寫操作。在建立或打開文件的基礎上執行所要求去的輸入輸出操作。
(4)關閉文件。當完成輸入輸出操作是,應把一打開的文件關閉。

文件的打開與關閉
1文件的打開
在c++中打開一個文件,就是講這個文件與一個流對象建立關聯。關閉一個文件,就是取消這種關聯。
(1)使用成員函數open打開文件
使用成員函數open()打開文件,也就是使某一指定的磁盤文件與某一已定義的文件流對象建立關聯。
調用成員函數open的一般形式為:
文件流對象.open(文件名路徑,打開方式);
如果省略路徑,則默認為當前目錄下的文件
(2)打開文件的另一種方法
例如:
ofstream out(″test.dat″);
相當于:
ofstream out;
out.open(″test.dat″);

(1)實際上,文件使用方式有默認值:
對于類ifstream, 默認值為ios::in
對于類ofstream, 默認值為ios::out
(2)當一個文件需要用兩種或多種方式打開時,可以用“位或”操作符(即“|”)把幾種方式組合在一起。
例如:
fstream myst;
myst.open(″test.dat″,ios::in|ios::out|ios::binary);
其他例子:
ios::in|ios:out //以輸入和輸出方式打開文件,
//文件可讀可寫
ios::out|ios:binary //以二進制方式打開一個輸出文件
ios::in|ios::binary //以二進制方式打開一個輸入文件
ios::in|ios::nocreate //打開一個輸入文件,若文件不存在,
//則返回打開失敗的信息
ios::app|ios::nocreate //打開一個輸出文件,在文件尾接著
//寫數據,若文件不存在,則返回打開失敗的信息

例 9.11 把字符串“I am a student.”寫入磁盤文件test1.dat中。

#include<iostream> #include<fstream> using namespace std; int main() { // ofstream fout("test1.dat",ios::out); ofstream fout;fout.open("test.dat",ios::out);if(!fout){cout<<"cannot open output file.\n";exit(1);}fout<<"I am a student .";fout.close();return 0; }


例9.12 把磁盤文件test1.dat中的內容讀出并顯示在屏幕上。

#include<iostream> #include<fstream> using namespace std; int main() {ifstream fin("test.dat",ios::in);if(!fin){cout<<"cannot open this file.\n";exit(1);}char str[80];fin.getline(str,80);cout<<str<<endl;fin.close();return 0;}


例9.13把一個整數、一個浮點數和一個字符串寫到磁盤文件f1.dat中。

#include<iostream> #include<fstream> using namespace std; //例9.13把一個整數、一個浮點數和一個字符串寫到磁盤文件f1.dat中。int main() {ofstream fout;fout.open("f1.dat",ios::out);if(!fout){cout<<"canot open this file.\n";exit(1);}fout<<10<<","<<123.456<<"This is a text file.\"\n";fout.close();return 0;}


例9.14 先建立一個輸出文件,向它寫入數據,然后關閉文件,再按輸入模式打開它,并讀取信息。

#include<iostream> #include<fstream> using namespace std; int main() {ofstream fout;fout.open("f2.dat",ios::out);if(!fout){cout<<"canot open output file.\n";exit(1);} fout<<100<<","<<hex<<100<<endl;fout<<"\"hello!\"\n";fout.close();ifstream fin("f2.dat",ios::in);if(!fin){cout<<"canot open input file.\n";exit(1);}char str[80];while(fin){fin.getline(str,80);cout<<str<<endl;}fin.close();}



2二進制文件的讀寫
任何文件都能以文本方式或二進制方式打開
在缺省的情況下,文件用文本方式打開
文本方式和二進制方式主要區別是:
在文本方式下輸入時,回車和換行兩個字符要轉換為字符“\n”,再輸入時,字符“\n”轉換為回車和換行兩個字符。這些轉換在二進制方式下是不進行的。
二進制文件進行讀寫有兩種方式:
(1)使用的是函數get()和put();
get函數是輸入流類istream中定義的成員函數,它可以從與流對象鏈接的文件中讀出數據,每次讀出一個字節(字符)。
put函數是輸出流類ostream中的成員函數,它可以與流對象連接的文件中寫入數據,每次寫入一個字節(字符)。
例9.15 將’a’ 至’z’ 的26個英文字母寫入文件,而后從該文件中讀出并顯示出來。

#include<iostream> #include<fstream> using namespace std; int test_write() {ofstream fout("f3.dat",ios::binary);if(!fout){cout<<"canot open output file.\n";exit(1);}char ch='a';for(int i=0;i<26;i++){fout.put(ch);ch++; }fout.close();return 0; } int test_read() {ifstream fin("f3.dat",ios::binary);if(!fin){cout<<"canot open file.\n";exit(1);}char ch;while(fin.get(ch)){cout<<ch;}fin.close();return 0; } int main() {test_write();test_read();return 0;}

(2)使用的是函數read()和write();

C++提供了兩個函數read和write,用來讀寫一個數據塊,
read函數最常用的調用格式如下:
*inf.read(char buf,int len)
inf是輸入文件流對象
第1個參數buf:是一個指針,它指向讀入數據所存放的內存空間的起始地址;
第2個參數len:是一個整數值,它是要讀入的數據的字節數。
功能:從與輸入文件流對象inf相關聯的磁盤文件中,讀取len個字節(或遇EOF結束),并把它們存放在字符指針buf所指的一段內存空間內。如果在len個字節(字符)被讀出之前就達到了文件尾,則read函數停止執行。

write函數最常用的調用格式如下:

outf.write(const char*buf,int len)
outf是輸出文件流對象
第1個參數buf:是一個指針,它指向讀入數據所存放的內存空間的起始地址;
第2個參數len:是一個整數值,它是要讀入的數據的字節數。
功能: 將字符指針buf所給出的地址開始的len個字節的內容不加轉換地寫到與輸出文件流對象outf相關聯的磁盤文件中。
注意:第1個參數的數據類型為 char*,如果是其他類型的數據,必須進行類型轉換,例如:
int array[]={50,60,70};
read((char*)& array,sizeof (array));
例9.17 將例9.16以二進制形式存放在磁盤文件中的數據(兩門課程的課程名和成績)讀入內存,并在顯示器上顯示。

#include<iostream> #include<fstream> using namespace std; struct list {char course[15];int score; }; int main() {list list1[2]={"Computer",90,"Mathematics",78};ofstream fout("f4.dat",ios::binary);if(!fout){cout<<"canot open output file.\n";exit(1);}for(int i=0;i<2;i++){fout.write((char*)&list1[i],sizeof(list1[i]));}fout.close();return 0; }

#include<iostream> #include<fstream> using namespace std; struct list {char course[15];int score;}; int main() {list list2[2];ifstream fin("f4.dat",ios::binary);if(!fin){cout<<"canot open input file.\n";exit(1);}for(int i=0;i<2;i++){fin.read((char*)&list2[i],sizeof(list2[i]));cout<<list2[i].course<<" "<<list2[i].score<<endl;}fin.close();return 0; }

這四種函數也可以用于文本問價你的讀寫。
除字符轉換方面略有差別外,文本文件的處理過程與二進制文件的處理過程基本相同。
(3) 檢測文件結束
在文件結束的地方有一個標志位,記為EOF(end of file)。使用成員函數eof(),可以檢測到這個結束符。該函數的原型是:

函數eof()的用法示例如下:
(1)檢測是否到達文件尾, 如果該函數的返回值非零,表示到達文件尾。返回值為零表示未到達文件尾。
ifstream ifs;

if (!ifs.eof()) … //尚未到達文件尾
(2) 檢測流對象是否為零,為零表示文件結束:
ifstream ifs;

if(!ifs) … //尚未到達文件尾
例如 在例9.1中使用了以下檢測流對象到達末尾的方法:
while(cin.get(ch))
cout.put(ch);
說明:當從鍵盤上輸入字符時,其結束符是ctrl_z,也就是說,按下ctrl_z,eof()函數返回的值為真。
(4)二進制數據文件的隨機讀寫
按一定順序進行讀寫的文件稱為順序文件。
順序文件只能按實際排列的順序,一個一個地訪問文件中的各個元素。
在類istream及類ostream中定義了幾個與讀或寫文件指針相關的成員函數,使我們可以在輸入輸出流內隨機移動文件指針,從而可以對文件的數據進行隨機讀寫。


例9.15 有3門課程的數據,要求:
(1)以讀寫方式打開一個磁盤文件,并把這些數據存到磁盤文件中;
(2)將文件指針定位到第3門課程,讀取第3門課程的數據并顯示出來;
(3)將文件指針定位到第1門課程,讀取第1門課程的數據并顯示出來;
(4)將文件指針從當前位置定位到下一門課程,讀取該門課程的數
據并顯示出來。

#include<iostream> #include<fstream> using namespace std; struct List { char course[15];int score;}; int main() { List list3[3]={{"Computer",90},{"Mathematics",78},{"English",84}};List st;fstream ff("f6.dat",ios::out|ios::binary);if(!ff){ cout<<"open f6.dat error!"<<endl; exit(1);} for(int i=0;i<3;i++) {ff.write((char*)&list3[i],sizeof(List)); }ff.close();fstream ff1("f6.dat",ios::in|ios::binary);if(!ff1){cout<<"open f6.dat error!"<<endl; exit(1);}ff1.seekp(sizeof(List)*2);ff1.read((char*)&st,sizeof(List));cout<<st.course<<"\t"<<st.score<<endl;ff1.seekp(sizeof(List)*0);ff1.read((char*)&st,sizeof(List));cout<<st.course<<"\t"<<st.score<<endl;ff1.seekp(sizeof(List)*1,ios::cur);ff1.read((char*)&st,sizeof(List));cout<<st.course<<"\t"<<st.score<<endl;ff1.close();return 0; }

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的c++的文件输入/输出的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。