C語言二進位制檔案讀取解析

2021-06-28 10:07:22 字數 3625 閱讀 1525

// 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 中,讀取二進位制檔案還是很容易的。除...