基于C流類庫的文件輸入輸出_第1頁
基于C流類庫的文件輸入輸出_第2頁
基于C流類庫的文件輸入輸出_第3頁
基于C流類庫的文件輸入輸出_第4頁
基于C流類庫的文件輸入輸出_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第7講基于C++流類庫的

文件輸入輸出1本講主要內(nèi)容1.基于C++流類庫的文本文件的讀寫2.基于C++流類庫的二進(jìn)制文件的讀寫3.C++程序的結(jié)構(gòu)2【例6-1】文本文件的讀寫在本例中,定義了3個學(xué)生對象Student1、Student2和Student3。首先進(jìn)行了翻開文件操作,將這些學(xué)生對象的信息以文本數(shù)據(jù)的形式寫入了文本文件“StudentInfo.txt〞,再通過讀取該文件,將這些信息讀入了另外3個學(xué)生對象Student1_1、Student2_1和Student3_1中,最后將Student1_1、Student2_1和Student3_1的信息進(jìn)行了輸出。3#include<iostream>#include<fstream>usingnamespacestd;classCDate { intm_nYear; intm_nMonth; intm_nDay;public: CDate(intnYear,intnMonth,intnDay); intGetYear(); intGetMonth(); intGetDay();};……日期類4classCPerson {protected: char*m_strName; char*m_strID; charm_cSex; CDatem_Birthday; public: CPerson(char*strName="",char*strID="",charcSex='0',intnYear=0,intnMonth=0,intnDay=0); ~CPerson(); voidSetName(char*strName); voidGetName(char*strName)const;…… virtualvoidPrintInfo()=0;

virtualvoidWriteFile(ofstream&fs)=0;//數(shù)據(jù)寫入文件

virtualvoidReadFile(ifstream&fs)=0;//從文件中讀取數(shù)據(jù)};……人員類輸出文件流類輸入文件流類5classCStudent:publicCPerson { staticunsignedlongm_nCount; private: char*m_strMajor; public: CStudent(char*strName="",char*strID="",charcSex='0',intnYear=0,intnMonth=0,intnDay=0,char*strMajor=""); ~CStudent(); voidSetMajor(char*strMajor); voidGetMajor(char*strMajor)const; voidCopy(CStudent&Student); staticunsignedlongGetCount(); virtualvoidPrintInfo();

voidWriteFile(ofstream&fs);//數(shù)據(jù)寫入文件

voidReadFile(ifstream&fs);//從文件中讀取數(shù)據(jù)};……6voidCStudent::WriteFile(ofstream&fs){

fs<<m_strName<<'\n'<<m_strID<<''<<m_cSex<<''<<m_Birthday.GetYear()

<<''<<m_Birthday.GetMonth()<<''<<m_Birthday.GetDay()<<''

<<m_strMajor<<endl;}利用插入運(yùn)算符將學(xué)生屬性信息寫到輸出文件流fs中7從輸入文件流fs中讀取1行信息;getline是fs對象的成員函數(shù)voidCStudent::ReadFile(ifstream&fs){ intnYear,nMonth,nDay; charstrName[256],strID[12],strMajor[256];

fs.getline(strName,256);

fs>>strID>>m_cSex>>nYear>>nMonth>>nDay;

fs.getline(strMajor,256);

delete[]m_strName; m_strName=newchar[strlen(strName)+1];

strcpy(m_strName,strName); delete[]m_strID;

m_strID=newchar[strlen(strID)+1]; strcpy(m_strID,strID); delete[]m_strMajor; m_strMajor=newchar[strlen(strMajor)+1]; strcpy(m_strMajor,strMajor); CDateBirthday(nYear,nMonth,nDay); m_Birthday=Birthday;}利用提取運(yùn)算符從輸入文件流fs中讀取信息8unsignedlongCStudent::m_nCount=0; intmain(){ CStudentStudent1("李江","50202300825",'0',1991,3,7,"計算機(jī)科學(xué)與技術(shù)"); CStudentStudent2("趙梅","50202300826",'1',1991,6,8,"計算機(jī)科學(xué)與技術(shù)"); CStudentStudent3("武峰","50202300827",'0',1990,5,6,"計算機(jī)科學(xué)與技術(shù)"); ofstreamfout("StudentInfo.txt"); if(fout.fail()) { cout<<"Openfilefailture!"<<endl; return1; } Student1.WriteFile(fout); Student2.WriteFile(fout); Student3.WriteFile(fout); fout.close();

定義輸出文件流對象fout并通過它翻開或創(chuàng)立文件StudentInfo.txt如果文件翻開或創(chuàng)立失敗,那么退出將學(xué)生的信息寫到輸出文件流對象fout中關(guān)閉文件9

ifstreamfin("StudentInfo.txt");

if(fin.fail()) { cout<<"Openfilefailture!"<<endl; return1; } CStudentStudent1_1,Student2_1,Student3_1;

Student1_1.ReadFile(fin); Student2_1.ReadFile(fin); Student3_1.ReadFile(fin);

fin.close(); Student1_1.PrintInfo(); Student2_1.PrintInfo(); Student3_1.PrintInfo(); return0;}定義輸入文件流對象fin并通過它翻開文件StudentInfo.txt如果文件翻開失敗,那么退出將輸入流文件對象fin中的數(shù)據(jù)讀到學(xué)生對象中關(guān)閉文件輸出學(xué)生信息10程序的運(yùn)行結(jié)果如下:姓名:李江編號:50202300825性別:男出生日期:1991,3,7專業(yè):計算機(jī)科學(xué)與技術(shù)姓名:趙梅編號:50202300826性別:女出生日期:1991,6,8專業(yè):計算機(jī)科學(xué)與技術(shù)姓名:武峰編號:50202300827性別:男出生日期:1990,5,6專業(yè):計算機(jī)科學(xué)與技術(shù)如果用記事本程序翻開文本文件“StudentInfo.txt〞,就會看到以下圖所示的內(nèi)容:11本例中對文件的操作過程①翻開文件StudentInfo.txt,如果該文件不存在,那么創(chuàng)立一個文件名為StudentInfo.txt的新文件。②將學(xué)生數(shù)據(jù)以文本的形式寫到文件中。③關(guān)閉此文件。④重新翻開StudentInfo.txt文件。⑤將文件中的數(shù)據(jù)讀到學(xué)生對象中。⑥關(guān)閉此文件。12說明〔1〕C++提供了3個用于文件輸入輸出的文件流類,如下所示。 ①ifstream:輸入文件流類,用于文件的輸入。 ②ofstream:輸出文件流類,用于文件的輸出。 ③fstream:輸入/輸出文件流類,用于文件的輸入/輸出。 在使用這些文件流類時,通常要在程序中包含頭文件fstream。例如:#include<fstream>13〔2〕文件流類對象的定義和文件的翻開①在利用文件流類進(jìn)行文件操作時,首先要建立流類的對象。例如: ifstreamfin; ofstreamfout; fstreamfin_out;②可以通過流類對象的構(gòu)造函數(shù)翻開文件,例如: ofstreamfout("StudentInfo.txt");該語句定義了輸出文件流類的對象fout,并通過其構(gòu)造函數(shù)翻開文件StudentInfo.txt。再例如: ifstreamfin("StudentInfo.txt");該語句定義了輸入文件流類的對象fin,并通過其構(gòu)造函數(shù)打開文件StudentInfo.txt。14③可以通過文件流對象的成員函數(shù)open翻開文件調(diào)用該函數(shù)的一般形式為: 文件流對象.open(文件名,翻開方式);其中,“文件名〞可以包括路徑〔如 “D:\\data\\StudentInfo.txt〞〕,如果不指明路徑,那么默認(rèn)為當(dāng)前目錄下的文件?!胺_方式〞決定如何翻開文件,如表6-1所示。15表6-1文件的翻開方式方式功能ios::app打開一個輸出文件,以將數(shù)據(jù)添加到文件的尾部ios::ate打開一個已存文件,并將文件指針移到文件的尾部ios::binary以二進(jìn)制的形式打開文件,默認(rèn)值為文本文件形式ios::in打開一個文件,進(jìn)行文件輸入操作ios::out打開一個文件,進(jìn)行文件輸出操作ios::trunc打開一個文件,如果該文件已存在,則清除文件的內(nèi)容,文件的長度變?yōu)榱恪?6●如果用ifstream類來定義一個流對象,那么隱含為輸入流,不必再添加ios::in說明;如果用ofstream類來定義一個流對象,那么隱含為輸出流,不必再添加ios::out說明。 例如: ifstreamin; in.open("test.dat");//等同于in.open("test.dat",ios::in); ofstreamout; out.open("test.dat");//等同于out.open("test.dat",ios::out)●如果文件翻開時需要多種翻開方式的組合,那么應(yīng)使用“|〞〔位或操作符〕將幾種翻開方式組合在一起。例如,可采用以下方式翻開一個能夠進(jìn)行輸入和輸出的二進(jìn)制文件。 fstreamfin_out; fin_out.open("test.dat",ios::in|ios::out|ios::binary);●當(dāng)指定“ios::out〞方式后,隱含為“ios::trunc〞方式,即如果翻開的輸出文件已存在,那么自動清空該文件的內(nèi)容。17④在進(jìn)行文件翻開操作時,應(yīng)該判斷文件翻開是否成功,見下面的語句。 if(fout.fail()) cout<<"Openfilefailture!"<<endl; fail函數(shù)是ios_base類(ios_base類是fstream、ifstream、ofstream的祖先類)的成員函數(shù)。在這里,當(dāng)返回值為true時,說明出現(xiàn)了文件翻開錯誤。18〔3〕文本文件的讀寫●getline函數(shù) 本例中,從文件流讀取數(shù)據(jù)時用到了getline函數(shù),見下面的語句。 fs.getline(strName,256); 函數(shù)getline(char*_Str,int_Count)的含義是:從文件流中讀取_Count個字節(jié)到_Str所指的內(nèi)存中,如果還沒有讀取_Count個字節(jié)就遇到回車符'\n',那么讀取過程中止。19〔4〕文件的關(guān)閉在對文件的讀寫操作完成后,應(yīng)關(guān)閉文件。通過關(guān)閉操作,文件流對象與相應(yīng)的物理文件進(jìn)行了脫離。如果不進(jìn)行文件的關(guān)閉,那么可能造成文件數(shù)據(jù)的喪失。關(guān)閉文件可使用流類的成員函數(shù)close完成,例如:fout.close();fin.close();206.2二進(jìn)制文件的讀寫當(dāng)進(jìn)行二進(jìn)制文件的讀寫時,在翻開文件時要使用“ios::binary〞來指定以二進(jìn)制的形式進(jìn)行文件流的操作。對二進(jìn)制文件的讀寫可使用get、put函數(shù)或read、write函數(shù)。這些函數(shù)也可以用于文本文件的讀寫。下面首先通過read、write函數(shù)改寫例6-1,實現(xiàn)二進(jìn)制文件的讀寫,然后介紹get、put函數(shù)的使用方法。216.2.1利用write和read函數(shù)實現(xiàn)二進(jìn)制文件的讀寫【例6-2】二進(jìn)制文件的讀寫。 本例將學(xué)生信息寫入二進(jìn)制文件,然后再從二進(jìn)制文件中讀出學(xué)生信息并進(jìn)行顯示。本例在例6-1的代碼根底上進(jìn)行修改,主要代碼如下所示。22……voidCStudent::WriteFile(ofstream&fs){ unsignedcharucStrLength; ucStrLength=strlen(m_strName)+1;

fs.write((char*)&ucStrLength,sizeof(ucStrLength));

fs.write(m_strName,ucStrLength);

ucStrLength=strlen(m_strID)+1;

fs.write((char*)&ucStrLength,sizeof(ucStrLength));

fs.write(m_strID,ucStrLength);

fs.write(&m_cSex,sizeof(m_cSex)); fs.write((char*)&m_Birthday,sizeof(m_Birthday));

ucStrLength=strlen(m_strMajor)+1;

fs.write((char*)&ucStrLength,sizeof(ucStrLength));

fs.write(m_strMajor,ucStrLength);

}寫入姓名字符串的長度(包括字符串結(jié)束符\0)寫入姓名字符串寫入編號字符串的長度寫入編號字符串寫入性別字符寫入出生日期寫入專業(yè)字符串的長度寫入專業(yè)字符串寫二進(jìn)制文件23voidCStudent::ReadFile(ifstream&fs){ unsignedcharucStrLength;

fs.read((char*)&ucStrLength,sizeof(ucStrLength));

delete[]m_strName; m_strName=newchar[ucStrLength];

fs.read(m_strName,ucStrLength);

fs.read((char*)&ucStrLength,sizeof(ucStrLength));

delete[]m_strID; m_strID=newchar[ucStrLength];

fs.read(m_strID,ucStrLength);

fs.read(&m_cSex,sizeof(m_cSex)); fs.read((char*)&m_Birthday,sizeof(m_Birthday)); fs.read((char*)&ucStrLength,sizeof(ucStrLength));

delete[]m_strMajor; m_strMajor=newchar[ucStrLength];

fs.read(m_strMajor,ucStrLength);

}讀入姓名字符串的長度讀入姓名字符串讀入編號字符串的長度讀入編號字符串讀入出生日期讀入專業(yè)字符串的長度讀入專業(yè)字符串讀入性別字符讀二進(jìn)制文件24unsignedlongCStudent::m_nCount=0;intmain(){ CStudentStudent1("李江","50202300825",'0',1991,3,7,"計算機(jī)科學(xué)與技術(shù)"); CStudentStudent2("趙梅","50202300826",'1',1991,6,8,"計算機(jī)科學(xué)與技術(shù)"); CStudentStudent3("武峰","50202300827",'0',1990,5,6,"計算機(jī)科學(xué)與技術(shù)"); ofstreamfout("StudentInfo.dat",ios::binary); if(fout.fail()) { cout<<"Openfilefailture!"<<endl; return1; } Student1.WriteFile(fout); Student2.WriteFile(fout); Student3.WriteFile(fout); fout.close();定義輸出文件流對象fout并通過它翻開或創(chuàng)立文件StudentInfo.dat如果文件翻開或創(chuàng)立失敗,那么退出將學(xué)生的信息寫到輸出文件流對象fout中關(guān)閉文件25

ifstreamfin("StudentInfo.dat",ios::binary);

if(fin.fail()) { cout<<"Openfilefailture!"<<endl; return1; } CStudentStudent1_1,Student2_1,Student3_1;

Student1_1.ReadFile(fin); Student2_1.ReadFile(fin); Student3_1.ReadFile(fin);

fin.close(); Student1_1.PrintInfo(); Student2_1.PrintInfo(); Student3_1.PrintInfo(); return0;}定義輸入文件流對象fin并通過它翻開文件StudentInfo.dat如果文件翻開失敗,那么退出將輸入流文件對象fin中的數(shù)據(jù)讀到學(xué)生對象中關(guān)閉文件輸出學(xué)生信息26程序的運(yùn)行結(jié)果如下:姓名:李江編號:50202300825性別:男出生日期:1991,3,7專業(yè):計算機(jī)科學(xué)與技術(shù)姓名:趙梅編號:50202300826性別:女出生日期:1991,6,8專業(yè):計算機(jī)科學(xué)與技術(shù)姓名:武峰編號:50202300827性別:男出生日期:1990,5,6專業(yè):計算機(jī)科學(xué)與技術(shù)如果用記事本程序翻開二進(jìn)制文件“StudentInfo.dat〞,就會看到以下圖所示的內(nèi)容:27說明〔1〕在進(jìn)行二進(jìn)制文件的讀寫之前,首先要以二進(jìn)制的形式翻開文件,見下面的語句。ofstreamfout("StudentInfo.dat",ios::binary);ifstreamfin("StudentInfo.dat",ios::binary);〔2〕write是ostream類的成員函數(shù),其函數(shù)形式如下:ostream&write(constchar*,int); 在進(jìn)行文件操作時,函數(shù)的第1個參數(shù)表示要寫入文件的數(shù)據(jù)所在的內(nèi)存起始地址,第2個參數(shù)是要寫入文件的字節(jié)數(shù)。〔3〕read是istream的成員函數(shù),其函數(shù)形式如下: istream&read(char*,int); 在進(jìn)行文件操作時,函數(shù)的第1個參數(shù)表示從文件中讀入的數(shù)據(jù)所存放的內(nèi)存空間的起始地址,函數(shù)的第2個參數(shù)表示從文件中讀入的字節(jié)數(shù)。286.2.2利用get和put函數(shù)實現(xiàn)二進(jìn)制文件的讀寫get函數(shù)是輸入流類istream的成員函數(shù),可以通過它從文件流對象中讀取數(shù)據(jù),每次讀出一個字節(jié)〔字符〕。put函數(shù)是輸出流類ostream的成員函數(shù),可以通過它向文件流對象中寫入數(shù)據(jù),每次寫入一個字節(jié)〔字符〕。下面給出一個利用get和put函數(shù)讀寫二進(jìn)制文件的例子。29【例6-3】將0~9共10個數(shù)寫入二進(jìn)制文件,然后從該文件中讀取這些數(shù)并顯示。#include<iostream>#include<fstream>usingnamespacestd;intmain(){

ofstreamfout("number.dat",ios::binary);

if(fout.fail()) { cout<<"Openfilefailture!"<<endl; return1; }定義輸出文件流對象fout并通過它翻開或創(chuàng)立文件number.dat如果文件翻開或創(chuàng)立失敗,那么退出30 for(unsignedcharc=0;c<10;c++) fout.put(c); fout.close(); ifstreamfin("number.dat",ios::binary); if(fin.fail()) { cout<<"Openfilefailture!"<<endl; return1; }將0~9這10個數(shù)寫到輸出文件流對象fout中向文件流中寫入1個字節(jié)關(guān)閉文件定義輸入文件流對象fin并通過它翻開文件number.dat如果文件翻開失敗,那么退出31 charch; while(1) { fin.get(ch); if(fin.eof()) break; cout<<(int)ch<<''; } fin.close(); return0;}從輸入流文件對象fin中讀取數(shù)據(jù)并顯示從文件流中讀取1個字節(jié)判斷是否到達(dá)了文件尾以整數(shù)的形式輸出字符變量ch的值關(guān)閉文件程序的運(yùn)行結(jié)果如下:012345678932說明〔1〕本例中使用的put函數(shù)的原型是: ostream&put(char)〔2〕本例中使用的get函數(shù)的原型是: istream&get(char&)〔3〕eof函數(shù)用于判斷是否到達(dá)了文件尾。函數(shù)返回值為真說明到達(dá)了文件尾,返回值為假說明未到達(dá)文件尾。33

C++程序的結(jié)構(gòu)

34通過多個文件組織程序一般一個較大的C++程序可按照下面三類文件來存放:將類的聲明作為頭文件來存放,文件擴(kuò)展名為.h或.hpp;將類成員函數(shù)的定義單獨組成一個文件,可單獨編譯,文件擴(kuò)展名為.cpp;將類的使用放在一個文件里,其中包含一個main()函數(shù),文件擴(kuò)展名為.cpp。35圖C++程序的結(jié)構(gòu)classA{…..};#include"A.h"intA::fun(){…..}#include"A.h"main(){Aob;cout<<ob.fun();}類界面類實現(xiàn)36C++程序設(shè)計思路通過面向?qū)ο蟪绦蛟O(shè)計方法,程序編制顯得相對自然和簡捷。首先定義各個類,然后定義假設(shè)干個對象,然后調(diào)用其成員函數(shù),由成員函數(shù)來完成程序員所規(guī)定的操作〔即讓對象表現(xiàn)自己〕。37對【例6-1】〔文本文件的讀寫〕進(jìn)行改寫,按照頭文件和cpp文件分開的方式進(jìn)行組織。38【例6-1】〔文本文件的讀寫〕中的類日期類人員類學(xué)生類39文本文件的讀寫Date.h //類聲明Date.cpp //類成員函數(shù)定義Person.h //類聲明Person.cpp //類成員函數(shù)定義Student.h //類聲明Student.cpp //類成員函數(shù)定義UMIS1_Text_File.cpp//主函數(shù)程序的根本結(jié)構(gòu)40#ifndef_DATE_H_#define_DATE_H_classCDate//日期類{ intm_nYear; intm_nMonth; intm_nDay;public: CDate(intnYear,intnMonth,intnDay); intGetYear(); intGetMonth(); intGetDay();};#endif通過預(yù)編譯指示防止對Date類的重復(fù)聲明Date.h#ifndef和#endif控制源代碼要編譯的局部41#include"Date.h"CDate::CDate(intnYear,intnMonth,intnDay){ m_nYear=nYear; m_nMonth=nMonth; m_nDay=nDay;}intCDate::GetYear(){ returnm_nYear;}intCDate::GetMonth(){ returnm_nMonth;}intCDate::GetDay(){ returnm_nDay;}Date.cpp42#ifndef_PERSON_H_#define_PERSON_H_#include"Date.h"#include<fstream>usingnamespacestd;classCPerson//人員類{protected: char*m_strName;//姓名 char*m_strID;//編號 charm_cSex;//性別:'0':男'1':女 CDatem_Birthday;//出生日期public: CPerson(char*strName="",char*strID="",charcSex='0',intnYear=0,intnMonth=0,intnDay=0); ~CPerson(); …… voidSetBirthday(CDateBirthday); CDateGetBirthday()const; virtualvoidPrintInfo()=0; virtualvoidWriteFile(ofstream&fs)=0;//數(shù)據(jù)寫入文件 virtualvoidReadFile(ifstream&fs)=0;//從文件中讀取數(shù)據(jù)};#endifPerson.h43#include"Person.h"CPerson::CPerson(char*strName,char*strID,charcSex,intnYear,intnMonth,intnDay):m_Birthday(nYear,nMonth,nDay){ m_strName=newchar[strlen(strName)+1]; strcpy(m_strName,strName); m_strID=newchar[strlen(strID)+1]; strcpy(m_strID,strID); m_cSex=cSex;}CPerson::~CPerson(){ delete[]m_strName; deletem_strID;}……CDateCPerson::GetBirthday()const{ returnm_Birthday;}Person.cpp44#ifndef_STUDENT_H#define_STUDENT_H#include"Person.h"classCStudent:publicCPerson//學(xué)生類:從人員類公有派生{ staticunsignedlongm_nCount;//學(xué)生人數(shù)private: char*m_strMajor;//專業(yè)public: CStudent(cha

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論