用lseek在linux下创建一个大文件,出现错误Illegal seek

用lseek在linux下创建一个大文件,出现错误Illegal seek,第1张

亲:

if((fd = open("2.txt",O_RDWR|O_CREAT)) <0)  先给文件描述符fd赋值,所以要加括号,再判断是否合法。

你可以加一条打印语句,输出fd的值,

if((fd = open("2.txt",O_RDWR|O_CREAT)) <0)

    毁扮  梁滚 {       

              perror("open")    

       }  

             printf("fd = %d\n",fd)

加括号的纤渣灶结果:

不加括号的结果:

lseek是库函数

库函数就是C++最基本的函数,也就是说没有这些东西无法定义C++。

C++的制定标准,并不决定库函数的底层是如何实现的,主要决定实现结果和大致逻辑。

所以,对于不同系统不同型号机器的lseek,它的实现是不一样的。

在大多数系统中,lssek的执行只是改变一个内存中的值。计算机读取磁盘很慢,而内存很快,于是 *** 作系统在内存中会事先保存好多带肆值,当下一个读盘周期开始的时候,计算机会以最优化激慧的读取顺序读取内存中设置的磁盘位置,lssek改变的就是那个位置。

所以耗时依赖你的系统和硬蠢铅轿件,10000 比100未必慢

是有这个限制的。纳盯裤

如果使用的标准的c函数的。

如果是你洞简是32 *** 作系统,c语言 *** 作文件的大小是 2^31 ,2G

如果是你是64 *** 作系统,c语言 *** 作文件的大小是.2^63 ,8589934592 G

你说的问题肯定,出在32位 *** 作系统上。

一是:

*** 作系统能不能允许创建2G以上的文件了,具体要看 *** 作系统了。

如果不允许,你的问题就没什么意义了!

如果 *** 作系统允许的话,都会提供,系统函数让你调用的。

你得自己去找资料了。

===============

你可以看一下,sqlite的源代码,我的3-5-4版本

他不用是用c语言标准库则睁的。函数,能windows提供的系统函数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 = (offset>>32) &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

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/8201297.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存