// filedefine.h
#ifndef _filedefine_h_
#define _filedefine_h_
#include
using namespace std;
/*檔案操作,對磁碟的讀寫:
fopen 開啟模式 和 快取區大小
開啟模式:
+: input + output
b: binary 沒有b修飾的是預設ascii文字操作
t: text,是文字檔案方式開啟讀寫,如果沒有b修飾,那麼預設就是t 文字方式。
wb:只寫方式開啟二進位制檔案,可以寫入的時候去掉文字結束符。
fwrite返回的長度不等於要寫的長度,那說明磁碟滿了。
fclose
讀寫:字元讀寫:
fputc fgetc
字串讀寫:
fputs fgets
資料塊讀寫:
fread 連續讀寫,檔案內部的指標游標會跟隨累加
fwrite 連續寫也會累加
格式化讀寫:
fscanf(fp,"%d%s", num, name)格式化讀取,將從檔案指標fp中讀取的資料存入num,name中,然後格式化輸出
fprintf
跳轉計算訪問索引:
fseek跳到指定的位置
ftell返回當前的長度
eof是-1作為文字檔案結束的標誌,但是在二進位制檔案中不行,需要用到feof函式。
螢幕操作,對鍵盤和螢幕的讀寫:
printf輸出到螢幕
gets從螢幕輸入
getc
putchar顯示讀取的字元
*/// 包頭
struct packageheader
/*packageheader& operator =(const packageheader &b)
*/};
// 每個檔案的索引資訊
struct filelist
};// 資料內容
struct studentdata
;#endif
// filepackage.h
#ifndef _filepackage_h_
#define _filepackage_h_
#include
#include
#include
using namespace std;
#include "filedefine.h"
class cfilepackage
;void openfile(const string strfilepath, char *szmode);
void readfile();
void writefile(vector*pvecdata);
studentdata* getfiledata(unsigned int fileid);
void closefile();
private:
file *m_pfile;
packageheader m_filehead;
mapm_mapfilelist; // unsigned int是檔案fileid
studentdata m_studata; // 資料
};#endif
// filepackage.cpp
#include "stdafx.h"
#include "filepackage.h"
cfilepackage::cfilepackage()
void cfilepackage::openfile(const string strfilepath, char *szmode)
m_pfile = fopen(strfilepath.c_str(), szmode);
if(m_pfile == null)
}void cfilepackage::closefile()
void cfilepackage::readfile()
// 直接讀取標頭檔案到記憶體結構體中
fread(&m_filehead, sizeof(packageheader),1, m_pfile);
m_mapfilelist.clear();
// 讀取m_ncount個檔案的索引
for(int i = 0; i < m_filehead.m_ncount; i++)
}studentdata* cfilepackage::getfiledata(unsigned int fileid)
filelist *filelist = &(itfile->second);
// 直接跳轉,讀取檔案資料
fseek(m_pfile, filelist->m_noffset, seek_set);
fread(&m_studata, sizeof(studentdata), 1, m_pfile);
//int ncurlength = ftell(m_pfile);//ftell函式是用來獲取檔案的當前讀寫位置;
// 重置檔案指標到檔案頭部
fseek(m_pfile, 0, seek_set); // fseek(fp,ol,seek_end);移動到檔案結尾
return &m_studata;
}void cfilepackage::writefile(vector*pvecdata)
packageheader;
每個檔案的索引資訊
//typedef struct tagfilelist
//filelist;
if(m_pfile == null && pvecdata == null)
int ncount = (int)pvecdata->size();
fseek(m_pfile, 0, seek_set);
fwrite(&m_filehead, sizeof(packageheader), 1, m_pfile);
filelist filelist;
fwrite(&filelist, sizeof(filelist), ncount, m_pfile);
maptempfilelist;
for(int i = 0; i < ncount; i++)
map::iterator itrfilelist = tempfilelist.begin();
fseek(m_pfile, sizeof(packageheader), seek_set);
for(; itrfilelist != tempfilelist.end(); ++itrfilelist)
fseek(m_pfile, 0, seek_end);
int nfilelen = ftell(m_pfile);
m_filehead.m_ncount = (int)tempfilelist.size();
m_filehead.m_nlen = nfilelen;
fseek(m_pfile, 0, seek_set);
fwrite(&m_filehead, sizeof(packageheader), 1, m_pfile);
fseek(m_pfile, 0, seek_set);
tempfilelist.clear();
}
用 C 讀取二進位制檔案
當想到所有檔案都轉換為 xml時,確實是一件好事。但是,這並非事實。仍舊還有大量的檔案格式不是xml,甚至也不是ascii。二進位制檔案仍然在網路中傳播,儲存在磁碟上,在應用程式之間傳遞。相比之下,在處理這些問題方面,它們比文字檔案顯得更有效率些。在 c 和 c 中,讀取二進位制檔案還是很容易的。除...
二進位制讀取檔案內容 C
filestream tempstream new filestream filename,filemode.open binaryreader tempreader new binaryreader tempstream,system.text.encoding.default char cc t...
用C 讀取二進位制檔案
當想到所有檔案都轉換為 xml時,確實是一件好事。但是,這並非事實。仍舊還有大量的檔案格式不是xml,甚至也不是ascii。二進位制檔案仍然在網路中傳播,儲存在磁碟上,在應用程式之間傳遞。相比之下,在處理這些問題方面,它們比文字檔案顯得更有效率些。在 c 和 c 中,讀取二進位制檔案還是很容易的。除...