是有這個限制的。
我們提供的服務有:網(wǎng)站設計、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、黃埔ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的黃埔網(wǎng)站制作公司
如果使用的標準的c函數(shù)的。
如果是你是32操作系統(tǒng),c語言操作文件的大小是 2^31 ,2G
如果是你是64操作系統(tǒng),c語言操作文件的大小是.2^63 ,8589934592 G
。
你說的問題肯定,出在32位操作系統(tǒng)上。
一是:
操作系統(tǒng)能不能允許創(chuàng)建2G以上的文件了,具體要看操作系統(tǒng)了。
如果不允許,你的問題就沒什么意義了!
如果操作系統(tǒng)允許的話,都會提供,系統(tǒng)函數(shù)讓你調(diào)用的。
你得自己去找資料了。
===============
你可以看一下,sqlite的源代碼,我的3-5-4版本
他不用是用c語言標準庫的。函數(shù),能windows提供的系統(tǒng)函數(shù)SetFilePointer,ReadFile
static int winRead(
sqlite3_file *id, /* File to read from */
void *pBuf, /* Write content into this buffer */
int amt, /* Number of bytes to read */
sqlite3_int64 offset /* Begin reading at this offset */
){
LONG upperBits = (offset32) 0x7fffffff;
LONG lowerBits = offset 0xffffffff;
DWORD rc;
DWORD got;
winFile *pFile = (winFile*)id;
assert( id!=0 );
SimulateIOError(return SQLITE_IOERR_READ);
OSTRACE3("READ %d lock=%d\n", pFile-h, pFile-locktype);
rc = SetFilePointer(pFile-h, lowerBits, upperBits, FILE_BEGIN);
if( rc==INVALID_SET_FILE_POINTER GetLastError()!=NO_ERROR ){
return SQLITE_FULL;
}
if( !ReadFile(pFile-h, pBuf, amt, got, 0) ){
return SQLITE_IOERR_READ;
}
if( got==(DWORD)amt ){
return SQLITE_OK;
}else{
memset(((char*)pBuf)[got], 0, amt-got);
return SQLITE_IOERR_SHORT_READ;
}
}
這個問題要從FILE結(jié)構(gòu)體的數(shù)據(jù)項組成講起: struct _iobuf { char *_ptr; //文件輸入的下一個位置 int _cnt; //當前緩沖區(qū)的相對位置 char *_base; //指基礎位置(即是文件的起始位置) int _flag; //文件標志 int _file; //文件的有效性驗證 int _charbuf; //檢查緩沖區(qū)狀況,如果無緩沖區(qū)則不讀取 int _bufsiz; //文件的大小 char *_tmpfname; //臨時文件名 } FILE; (注:這是vc++6.0對FILE的定義) 在用fopen()函數(shù)打開文件后系統(tǒng)將自動建立一個數(shù)據(jù)塊存放上述信息。 其中“char *_base; ” 指向文件頭在緩沖區(qū)的位置(即fseek()函數(shù)第三形參origin的SEEK_SET常量) “char *_ptr;” 減一即文件指針的當前位置(即fseek()函數(shù)第三形參origin的SEEK_CUR常量) 函數(shù)原型:int fseek( FILE *stream, long offset, int origin ) 中offset參數(shù)是個相對變量,它是相對于origin而言的。比如 int fseek( fp,100L,SEEK_SET ); 就是以文件頭為基準向后移動100個字節(jié)。原理就是對內(nèi)存中的FILE結(jié)構(gòu)體中的元素作如下操作 FILE._ptr=FILE._base+100; int fseek( fp,100L,SEEK_CUR ); 就是以文件的當前位置為基準向后移動100個字節(jié),相應的:FILE._ptr+=100; 其他的就不多講了.明白了嗎?
int fseek(FILE *stream, long offset, int fromwhere);函數(shù)設置文件指針stream的位置。
如果執(zhí)行成功,stream將指向以fromwhere為基準,偏移offset(指針偏移量)個字節(jié)的位置,函數(shù)返回0。如果執(zhí)行失敗(比如offset超過文件自身大小),則不改變stream指向的位置,函數(shù)返回一個非0值。
函數(shù)設置文件指針stream的位置。如果執(zhí)行成功,stream將指向以fromwhere(偏移起始位置:文件頭0(SEEK_SET),當前位置1(SEEK_CUR),文件尾2(SEEK_END))為基準,偏移offset(指針偏移量)個字節(jié)的位置。如果執(zhí)行失敗(比如offset超過文件自身大小),則不改變stream指向的位置。
fseek函數(shù)和lseek函數(shù)類似,但lseek返回的是一個off_t數(shù)值,而fseek返回的是一個整型。
所以,fseek(fp,sizeof(int)*3,0)函數(shù)將文件指針指向從文件開頭,向后偏移3個int單元的地方。
首先得保證文件已經(jīng)打開,不然會報錯。
fseek是一種函數(shù)
fp :指針
offset:偏移量
seek_set:文件開頭
總體意思,將指針移到文件開頭,偏移量為“2”(自己設置多少,正后,負前,我設置的意思是移動到后2個字節(jié)處)