1. 程式人生 > >C中的檔案處理相關知識

C中的檔案處理相關知識


最近在寫資料結構的實驗時,要用到儲存和讀取文字檔案的操作,於是我回顧了一下在上個學期學習C++檔案處理的時候,我用到的是建立檔案類,建立物件對檔案進行操作。

而C對檔案的操作核心上離不開指標的運用。

C++操作是對物件的操作,因此首先應該建立寫檔案流的物件,即ofstream ofile ,對物件的操作都是通過方法實現的。

而在C中,是通過檔案指標 FILE *fp 和對應的庫函式 fopen close fputs.... 來實現的,其中fopen也包含寫操作檔案的名稱和檔案操作方式這兩大引數。

C檔案操作,下面是我寫的一個例子,1.建立FILE指標 2.fopen開啟檔案 3.判斷是否建立或開啟成功 4.分配記憶體空間讀寫操作 5.關閉!

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int main(){
	FILE *F;
	char *str;
	F = fopen("lalal.txt","r");
	//用到fgets 讀取字串 
	if(!F) cout<<"開啟失敗或者建立失敗"<<endl;
	else{
	//	str = (char*)malloc(sizeof(char)*100);//分配空間 
		str = new char[256];
		fgets(str,99,F); 
		fgets(str+strlen(str),99,F); 
		if(str)
			cout<<str;
//		char ch ;
//		while(!feof(F)){
//			ch = fgetc(F);
//			cout<<ch;
//		}	
	} 
	return 0 ; 
} 
我使用了兩種方式分配記憶體空間,一種是C的方法一種是C++的方法。

C++:我建立了兩個類,一個是檔案輸出類一個是檔案輸入類。

class Ofile{//建立一個檔案輸出類
private:
        string file_name;
        static int count;//建立靜態變數用於計數
public:
        ofstream ofile;
        Ofile(string);
        template<typename T>//用函式 模板實現
        void add_class(T& m){
            this->ofile.write((char*)&m,sizeof(T));
        }
        static int show_count(){//寫一個靜態方法返回檔案類建立次數
            return Ofile::count;
        }
        void set_file(string name){//用方法關聯檔案流
            this->ofile.open(name.c_str(),ios::out|ios::binary);
        }
        void set_securer();
        void set_cleaner();
		void set_maintenancer(); 

//        void add_class(securer& m);
//        void add_class(cleaner& m);

};
int Ofile::count = 0;
Ofile::Ofile(string filename){
    this->ofile.open(filename.c_str(),ios::out|ios::binary);
    Ofile::count++;
}

void Ofile::set_maintenancer(){
	cout<<"工程師檔案流正在輸出"<<endl; 
}


class Ifile{//建立一個檔案輸入類
private:
    string file_name;
    static int count;
public:
    ifstream ifile;
    Ifile(string filename){
        this->ifile.open(filename.c_str(),ios::in|ios::binary);
        Ifile::count++;
    }

    template<typename T>//用函式 模板實現
//    T add_class(T& a){
//        T m;
//        this->ifile.read((char*)&m,sizeof(T));
//        return m;
//
//    }
    void add_class(T& a){
    	this->ifile.read((char*)&a,sizeof(T));
	}
//    securer& add_class(){
//    	securer m;
//    	this->ifile.read((char*)&m,sizeof(securer));
//    	return m;
//	}
    static int show_count(){//寫一個靜態方法返回檔案類建立次數
        return Ifile::count;
    }
    void set_file(string name){//用方法關聯檔案流
        this->ifile.open(name.c_str(),ios::in|ios::binary);
    }


};
int Ifile::count = 0;