C/C++檔案輸入輸出(詳細介紹)
´在標頭檔案iostream中定義有兩個流類:輸入流類istream和輸出流類ostream,且用這兩個類定義了流物件cin和cout:
´Istream cin;
´ostream cout;
´cin是一個istream類的物件,它從標準輸入裝置(鍵盤)獲取資料,程式中的變數通過流提取符“>>”從流中提取資料。流提取符“>>”從流中提取資料時通常跳過輸人流中的空格、tab鍵、換行符等空白字元。注意:只有在輸入完資料再按回車鍵後,該行資料才被送入鍵盤緩衝區,形成輸入流,提取運算子“>>”才能從中提取資料。注意保證從流中讀取資料能正常進行。
´cout
在定義流物件時,系統會在記憶體中開闢一段緩衝區,用來暫存輸入輸出流的資料。
C++的iostream與C的printf/scanf的區別
´1. 型別處理更安全、智慧,printf中對付int、float等說明符比較麻煩
´2. 擴充套件性更強,iostream使用的<<、>>操作符都是可過載,只要過載相關的運算子就可以
´ 3. 流風格的寫法也比較自然簡潔
´4. printf/scanf的速度比cin/cout快
幾個輸入函式介紹:
´1、cin.get()
´ cin.get(字元變數名)可以用來接收字元
´cin.get(字元陣列名,接收字元數目)用來接收一行字串,可以接收空格2、cin.getline(接收字串的變數,接收字元個數,結束字元)用法:接收一個字串,可以接收空格並輸出3、getline()用法:接收一個字串,可以接收空格並輸出,需包含“#include<string>”
´注意:cin.getline()屬於istream流,而getline()屬於string
檔案I/O也稱為讀檔案(輸入)和寫檔案(輸出),c++標準庫中提供兩個類ifstream和ofstream,分別用於檔案的輸入和輸出。
一.檔案的寫操作:
寫操作對應的有:<<、put、write 等,我們來看下他們分別都能實現什麼樣的寫檔案功能!
①、寫文字型別/ASCII碼型別的可見字串:<<、put
int main(){
short var = 20000;
ofstream fs;
fs.open("1.txt");
if (!fs) return 0;
fs << var << endl;
fs << "檔案寫入" << endl;
fs.put('Y');
fs.close();
return 0;
}
這就是寫文字檔案的方式,其中 << 支援的型別比較多,put 只能寫單個字元到檔案,還是有一定侷限性的,所以 put 平時用的比較少
參考網站:http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/
C/C++重定向 標準輸入輸出的庫函式
´所謂重定向輸出,就是可以把原本只是輸出在控制檯的字元,輸出到你指定的路徑檔案中。(輸入類似,就是從指定的檔案中讀取,而不是讀取在控制檯中的輸入。)重定向函式可以在任何時候開啟、關閉。
´函式名:freopen
´標準宣告:FILE *freopen( const char *path, const char *mode, FILE *stream );
´所在檔案: <stdio.h>
引數說明: path: 檔名,用於儲存輸入輸出的自定義檔名。 mode: 檔案開啟的模式。和fopen中的模式(如r讀, w寫)相同。 stream: 一個檔案,通常使用標準流檔案。 返回值:成功,則返回一個path所指定檔案的指標;失敗,返回NULL。功能:實現重定向,把預定義的標準流檔案定向到由path指定的檔案中。標準流檔案具體是指stdin、stdout和stderr。其中stdin是標準輸入流,預設為鍵盤;stdout是標準輸出流,預設為螢幕;stderr是標準錯誤流,一般把螢幕設為預設
輸入一個正整數n(n<100,n從檔案in.txt讀入),求n的階乘(答案寫入檔案out.txt)。
//c++語法
#include<iostream>
#include<stdio.h>
using namespace std;
int fac(int n){
return (n==1)? 1:n*fac(n-1);
}
int main(){
int n,m;
freopen("in.txt","r",stdin); //輸入重定向,輸入資料將從in.txt檔案中讀取
freopen("out.txt","w",stdout); //輸出重定向,輸出資料將儲存out.txt檔案中
while(cin>>n){
//m=fac(n);
cout<<"輸入n的階乘為:"<<fac(n)<<endl; // 注意使用endl
}
fclose(stdin);//關閉重定向輸入
fclose(stdout);//關閉重定向輸出
return 0;
}
//c語法
#include<stdio.h>
int fac(int n){
return (n==1)? 1:n*fac(n-1);
}
int main(){
int n,m;
freopen("in2.txt","r",stdin); //輸入重定向,輸入資料將從in.txt檔案中讀取
freopen("out2.txt","w",stdout); //輸出重定向,輸出資料將儲存out.txt檔案中
while(scanf("%d %d",&n,&m)!=EOF){
printf("n的階乘為:%d\n",fac(n));
}
fclose(stdin);//關閉重定向輸入
fclose(stdout);//關閉重定向輸出
return 0;
}
getline()該函式是從檔案中讀取一行資料,一行就是有換行符 \n,或者達到 getline 的緩衝區大小,或者讀到檔案末尾。
#include <fstream>
using namespace std;
int main(int argc, char* argv[]){
short var = 20000;
ofstream fs_out;
fs_out.open("d:\\123.txt");
if (!fs_out) return 0;
fs_out << var << endl;
fs_out << var + 1 << endl;
fs_out << var + 2 << endl;
fs_out.close();
ifstream fs_in;
fs_in.open("d:\\123.txt");
if (!fs_in) return 0;
char sz[100] = { 0 };//快取區
fs_in.getline(sz, 100);
fs_in.getline(sz, 100);
fs_in.getline(sz, 100);
fs_in.close();
return 0;
}
//②、二進位制型別寫檔案:write
int main(){
short var = 20000;
ofstream fs;
fs.open("3.txt");
if (!fs) return 0;
fs.write((char*)&var, sizeof(var));
fs.close();
return 0;
}
//①、讀文字型別/ASCII碼型別的檔案:>>、get、getline
int main(){
short var = 20000;
ofstream fs_out;
fs_out.open("4.txt");
if (!fs_out) return 0;
fs_out << var << endl;
fs_out.close();
var = 3000;
ifstream fs_in;
fs_in.open("4.txt");
if (!fs_in) return 0;
fs_in >> var;
char ch = fs_in.get();
fs_in.close();
return 0;
}