1. 程式人生 > >C/C++檔案輸入輸出(詳細介紹)

C/C++檔案輸入輸出(詳細介紹)

´在標頭檔案iostream中定義兩個流類:輸入流類istream和輸出流類ostream,且用這兩個類定義了流物件cincout:

´Istream cin;

´ostream cout;

´cin是一個istream類的物件,它從標準輸入裝置(鍵盤)獲取資料,程式中的變數通過流提取符“>>”從流中提取資料。流提取符“>>”從流中提取資料時通常跳過輸人流中的空格、tab鍵、換行符等空白字元。注意:只有在輸入完資料再按回車鍵後,該行資料才被鍵盤緩衝區,形成輸入流,提取運算子“>>”才能從中提取資料。注意保證從流中讀取資料能正常進行

´cout

是一個ostream類的物件,它有一個成員運算函式operator<<,每次呼叫的時候就會向輸出裝置輸出。operator用運算子過載,可以接受不同型別的資料,如整型、浮點型、字串甚至指標,等等cout是標準輸出裝置,一般輸出到螢幕。

在定義流物件時,系統會在記憶體中開闢一段緩衝區,用來暫存輸入輸出流的資料

C++iostreamCprintf/scanf的區別

´1. 型別處理更安全、智慧,printf中對付intfloat等說明符比較麻煩

´2. 擴充套件性更強,iostream使用的<<>>操作符都是可過載,只要過載相關的運算子就可以

´ 3. 流風格的寫法也比較自然簡潔

´4. printf/scanf的速度比cin/cout

幾個輸入函式介紹:

´1cin.get()

´ cin.get(字元變數名)可以用來接收字元

´cin.get(字元陣列名,接收字元數目)用來接收一行字串,可以接收空格2cin.getline(接收字串的變數,接收字元個數,結束字元)用法:接收一個字串,可以接收空格並輸出3getline()用法:接收一個字串,可以接收空格並輸出,需包含“#include<string>”

´注意:cin.getline()屬於istream流,而getline()屬於string

流,是不一樣的兩個函

檔案I/O也稱為讀檔案(輸入)和寫檔案(輸出),c++標準庫中提供兩個類ifstreamofstream,分別用於檔案的輸入和輸出。

.檔案的寫操作:

寫操作對應的有:<<putwrite 等,我們來看下他們分別都能實現什麼樣的寫檔案功能!

①、寫文字型別/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指定的檔案中。標準流檔案具體是指stdinstdoutstderr。其中stdin是標準輸入流,預設為鍵盤;stdout是標準輸出流,預設為螢幕;stderr是標準錯誤流,一般把螢幕設為預設

輸入一個正整數nn<100n從檔案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;
}