C中的檔案處理相關知識
阿新 • • 發佈:2019-01-25
最近在寫資料結構的實驗時,要用到儲存和讀取文字檔案的操作,於是我回顧了一下在上個學期學習C++檔案處理的時候,我用到的是建立檔案類,建立物件對檔案進行操作。
而C對檔案的操作核心上離不開指標的運用。
C++操作是對物件的操作,因此首先應該建立寫檔案流的物件,即ofstream ofile ,對物件的操作都是通過方法實現的。
而在C中,是通過檔案指標 FILE *fp 和對應的庫函式 fopen close fputs.... 來實現的,其中fopen也包含寫操作檔案的名稱和檔案操作方式這兩大引數。
C檔案操作,下面是我寫的一個例子,1.建立FILE指標 2.fopen開啟檔案 3.判斷是否建立或開啟成功 4.分配記憶體空間讀寫操作 5.關閉!
我使用了兩種方式分配記憶體空間,一種是C的方法一種是C++的方法。#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++:我建立了兩個類,一個是檔案輸出類一個是檔案輸入類。
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;