程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中輸出輸入流及文件流操作總結

C++中輸出輸入流及文件流操作總結

編輯:關於C++

C++中輸出輸入流及文件流操作總結。本站提示廣大學習愛好者:(C++中輸出輸入流及文件流操作總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中輸出輸入流及文件流操作總結正文


本文實例為大家分享了C++中輸出輸入流及文件流操作筆記,供大家參考,詳細內容如下

1、流的控制

    iomanip     在運用格式化I/O時應包括此頭文件。
    stdiostream   用於混合運用C和C + +的I/O機制時,例如想將C順序轉變為C++順序

2、類承繼關系


ios是籠統基類,由它派生出istream類和ostream類, iostream類支持輸出輸入操作,iostream類是從istream類和ostream類經過多重承繼而派生的類

類ifstream承繼了類istream,類ofstream承繼了類ostream,類fstream承繼了 類iostream

iostream頭文件中4種流對象


cout補充
1、用“cout<<”輸入根本類型的數據時,可以不用思索數據是什麼類型,零碎會判別數據的類型

並依據其類型選擇調用與之婚配的運算符重載函數。這個進程都是自動的,用戶不用干涉。

   假如在C言語中用prinf函數輸入不同類型的數據,必需辨別指定相應的輸入格式符,非常費事,而且容易出錯

2、cout流在內存中對應開拓了一個緩沖區,用來寄存流中的數據,當向cout流插 人一個endl時,

     不管緩沖區能否已滿,都立刻輸入流中一切數據,然後拔出一個換行符, 並刷新流(清空緩沖區)。

   留意假如插人一個換行符”\n“(如cout<<a<<"\n"),則只輸入和換行,而不刷新cout 流(但並不是一切編譯零碎都表現出這一區別)。

3、在iostream中只對"<<"和">>"運算符用於規范類型數據的輸出輸入停止了重載,但未對用戶聲明的類型數據的輸出輸入 停止重載。

    假如用戶聲明了新的類型,並希望用"<<"和">>"運算符對其停止輸出輸入,依照重運算符重載來做。

cout 流通常是傳送到顯示器輸入,但也可以被重定向 輸入到磁盤文件,而cerr流中的信息只能在顯示器輸入

cerr是不經過緩沖區,直接向顯示器上輸入有關信息,而clog中的信息寄存在緩沖區中,緩沖區滿後或遇endl時向顯示器輸入

3、規范輸出流 cin

    重點掌握的函數
    cin.get()  //讀入一個字符並前往它的值
    cin.get(一個參數)  //讀入一個字符並把它存儲在ch
    cin.get(兩個參數)  //可以讀取字符串
    cin.get(三個參數)  //可以讀字符串  
    cin.getline()
    cin.ignore() //讀取字符並疏忽指定字符
    cin.peek()  //反省下一個輸出的字符,不會把字符從流中移除
    cin.putback()  //前往一個字符給一個流

重要
1、運用cin,從流中讀出的字符,流中就沒有這字符了,再次讀取時只能讀取剩下的
2、緩沖去只要在遇到EOF、手動敲回車、流(緩存區)滿時,才將流中的字符全部讀出(即清空緩存區)

練習
1、從流中取一個字符,然後在放出來;
2、判別流中的第一個字符是不是放出來的那個字符;
3、從流中讀取10個字符;
4、從流中疏忽5個字符,再讀取10個字符;
5、最後讀取剩下的字符,最後輸入讀到的一切字符

#include <iostream>
using namespace std;

int main()
{
 char ch1;
 int look;
 char str1[11] = {0};
 char str2[11] = {0};
 char str3[100] = {0};
 
 //從流中取一個字符,然後在放出來
 ch1 = cin.get();
 cin.putback(ch1);

 //判別流中的第一個字符是不是放出來的那個字符
 look = cin.peek();
 if(look == (int)ch1)
 {
 cout<<"cin.peek()放出來的字符在第一個地位"<<endl;
 }
 else
 {
 cout<<"cin.peek()放出來的字符不是在第一個地位"<<endl;
 }

 //從流中讀取10個字符
 cin.get(str1,11);

 //從流中疏忽5個字符,再讀取10個字符
 cin.ignore(5);
 cin.get(str2,11,EOF);

 //最後讀取剩下的字符,最後輸入讀到的一切字符
 cin.getline(str3,100);

 //輸入讀到的數據
 cout<<"第一個字符"<<ch1<<endl;
 cout<<"第一組 字符串:"<<str1<<endl;
 cout<<"第二組 字符串:"<<str2<<endl;
 cout<<"剩下的字符串:"<<str3<<endl;

 system("pause");
 return 0;
}

輸入:

0123456789abcde9876543210zzzzzzzzzzxxxxxxxxxxxxxyyyyyyyyyyyy
cin.peek()放出來的字符在第一個地位
第一個字符0
第一組 字符串:0123456789
第二組 字符串:9876543210
剩下的字符串:zzzzzzzzzzxxxxxxxxxxxxxyyyyyyyyyyyy

4、規范輸入流 cout

  流成員函數

  cout.flush() //清空緩沖區
  cout.put()   //把字符寫入流中
  cout.write() //將字符串寫入以後輸入流中

  eg : cout.setf( ios::dec );

    cout.setf(ios::hex,ios::basefield);【建議運用這種】

 需留意:

1、fmtflags setf( fmtflags flags ); 運用這種,一定要先取消以後基【cout.unself()】,之後才可以設置新的基

 2、fmtflags setf( fmtflags flags, fmtflags needed ); 運用這種,第二個參數設為以後的基,或許當不知道以後基時,設為ios_base::basefield肅清以後的一切能夠的基   

控制符,頭文件<iomanip>


eg:  cout<<setw(5);

5、文件I/O

由於文件設備並不像顯示器屏幕與鍵盤那樣是規范默許設備,不能像cout那樣事後定義的全局對象,所以我們必需自己定義一個該類的對象。

ifstream類,它是從istream類派生的,用來支持從磁盤文件的輸出。

ofstream類,它是從ostream類派生的,用來支持向磁盤文件的輸入。

fstream類,它是從iostream類派生的,用來支持對磁盤文件的輸出輸入。

文件原理

    文件翻開都有一個文件指針,該指針的初始地位由I/O方式指定,每次讀寫都從文件指針的以後地位開端。每讀入一個字節,指針就後移一個字節。當文件指針移到最後,就會遇到文件完畢EOF(文件完畢符也占一個字節,其值為-1),此時流對象的成員函數eof的值為非0值(普通設為1),表示文件完畢 了。

    文件封閉,實踐上是解除該磁盤文件與文件流的關聯,原來設置的任務方式也生效,這樣,就不能再經過文件流對該文件停止輸出或輸入

    文件類型:1、ASCII文件:文件的每一個字節中均以ASCII代碼方式寄存數據,即一個字節寄存一個字符,這個文件就是ASCII文件(或稱字符文件)。

     2、二進制文件:文件中的信息不是字符數據,而是字節中的二進制方式的信息,因而它又稱為字節文件

常用函數

翻開文件:  

方式1:對文件輸入流、文件流對象,經過ofstream類的結構函數翻開文件

    格式: ofstream (磁盤文件名, 輸出輸入方式);

    假如ofstream  為0(假),表示翻開操作失敗

    如:   ofstream fout1(fname,ios::out);

    輸出輸入方式可以運用可以停止組合運用的,以“或”運算(“|”)的方式,如:fstream fout(fname,ios::out|ios::in)

方式2:對文件的輸入和輸出流對象、文件流對象,都可經過open函數翻開文件

    格式: 文件流對象.open(磁盤文件名, 輸出輸入方式);

    前往值:為0(假),翻開操作失敗

    如:   fout.open(fname,ios::out) 

封閉文件:

 在對已翻開的磁盤文件的讀寫操作完成後,必需要封閉該文件  如:  outfile.close( );

文件操作

    1、可以用流拔出運算符“<<”和流提取運算符“>>”輸出輸入規范類型的數據(>> 讀出時在遇空格、換行都完畢)。

    2、也可以用文件流的put、get、geiline等成員函數停止字符的輸出輸入。

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

int main()
{
 char fname[] = "d:/file1.txt";
 char buff[1024]= {0};
 /*********** 寫文件 *************/
 //方式1 輸入流ofstream對象調用fopen函數
 ofstream fout;
 fout.open(fname,ios::out);
 if(!fout)
 {
 cout<<"翻開文件失敗"<<fname<<endl;
 }
 fout<< "hello world !"; //經過左移運算符寫入字符串
 fout.flush();
 fout.close();

 //方式2 調用輸入流ofstream對象的結構函數
 ofstream fout1(fname,ios::out);
 if(!fout1)
 {
 cout<<"翻開文件失敗"<<fname<<endl;
 }
 fout1.put('h'); //經過put函數寫入字符
 fout1.put('e');
 fout1.put('l');
 fout1.put('l');
 fout1.put('o');
 fout1.put('\n');
 fout1.flush();
 fout1.close();

 //文件流對象寫文件
 fstream file2(fname,ios::in|ios::out);
 file2<<"abdfd\n";
 file2<<"11111\n";
 file2.flush();
 file2.close();

 /*********** 讀文件 *************/
 //輸出流ifstream對象讀取文件內容
 ifstream fin;
 fin.open(fname,ios::in);
 fin.getline(buff,1024); //經過getline函數讀取字符串
 cout<<buff<<endl; 
 fin.close();
 
 //文件流對象讀文件內容
 fstream file1(fname,ios::in|ios::out);
 file1>>buff; //經過右移運算符讀出字符串
 file1.close();
 cout<<buff<<endl;


 system("pause");
 return 0;
}

二進制文件操作

    對二進制文件的讀寫次要用istream類的成員函數read和write來完成。這兩個成員函數的原型為

     istream& read(char *buffer,int len);

     ostream& write(const char * buffer,int len);

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

class Teacher
{
public:
 Teacher()
 {

 }
 Teacher(int age,char name[20])
 {
 this->age = age;
 strcpy(this->name,name);
 }
 void prinfInfo()
 {
 cout<<"Teacher name:"<<this->name<<"  age:"<<this->age<<endl;
 }
private:
 int age;
 char name[20];
};

int main()
{
 Teacher t1(31,"xiaoming");
 Teacher t2(32,"xiaohong");
 Teacher t3(33,"xiaohua");
 Teacher t4(34,"xiaoxin");
 char fname[] = "d:/file2";
 fstream fs(fname,ios::binary|ios::out);
 if(!fs)
 {
 cout<<"文件翻開失敗"<<endl;
 }
 fs.write((char *)&t1,sizeof(Teacher));
 fs.write((char *)&t2,sizeof(Teacher));
 fs.write((char *)&t3,sizeof(Teacher));
 fs.write((char *)&t4,sizeof(Teacher));
 fs.flush();
 fs.close();

 fstream fs2(fname,ios::binary|ios::in);
 if(!fs)
 {
 cout<<"文件翻開失敗"<<endl;
 }
 Teacher tt;
 fs2.read((char *)&tt,sizeof(Teacher));
 tt.prinfInfo();
 fs2.read((char *)&tt,sizeof(Teacher));
 tt.prinfInfo();
 fs2.read((char *)&tt,sizeof(Teacher));
 tt.prinfInfo();
 fs2.read((char *)&tt,sizeof(Teacher));
 tt.prinfInfo();
 fs2.close();

 system("pause");
 return 0;
}

輸入:

Teacher name:xiaoming  age:31
Teacher name:xiaohong  age:32
Teacher name:xiaohua  age:33
Teacher name:xiaoxin  age:34

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved