lseek函数出现空洞的返回值是什么啊?
函数名: lseek 功 能: 移动文件读/写指针用 法: long lseek(int handle, long offset, int fromwhere);所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。使用 lseek 函数可以改变文件的 cfo 。lseek 的以下用法返回当前的偏移量:off_t currpos;currpos = lseek(fd, 0, SEEK_CUR);这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为 ESPIPE。对于普通文件(regular file),cfo 是一个非负整数。但对于特殊设备,cfo 有可能是负数。因此,我们不能简单地测试 lseek 的返回值是否小于 0 来判断 lseek 成功与否,而应该测试 lseek 的返回值是否等于 -1 来判断 lseek 成功与否。lseek 仅将 cfo 保存于内核中,不会导致任何 I/O 操作。这个 cfo 将被用于之后的读写操作。如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。编辑本段程序例#include #include #include #include #include #include int main(void){int handle;char msg[] = "This is a test";char ch;/* create a file */handle = open("TEST.$$$", O_CREAT | O_RDWR, S_IREAD | S_IWRITE);/* write some data to the file */write(handle, msg, strlen(msg));/* seek to the begining of the file */lseek(handle, 0L, SEEK_SET);/* reads chars from the file until we hit EOF */do{read(handle, &ch, 1);printf("%c", ch);} while (!eof(handle));close(handle);return 0; }
lseek函数出现空洞的返回值是0 lseek用于显式地为一个已打开的文件设置其偏移量,每个打开的文件都有一个与其相关联的“当前文件偏移量”(current file offset)。通常是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数。按系统默认的情况,当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0。可以调用lseek显式地为一个打开的文件设置其偏移量。
设置文件偏移量为绝对值成功或失败,失败则为-1
The lseek() function shall not, by itself, extend the size of a file. 函数本身不会撑大文件,除非你在这个位置之后写入数据,才会“在没有被实际写入文件的所有字节由重复的 0 表示”。 RETURN VALUEUponsuccessfulcompletion,theresulting offset, as measured in bytes from the beginning of thefile, shall be returned.Otherwise, (off_t)-1 shall be returned, errno shall be set to indicate the error, and the file offset shall remain unchanged函数成功完成后,返回从文件头到当前位置(文件指针会移到所指定的位置)的字节数。如果函数执行失败,函数返回-1,errno会被赋值指出错误原因,文件偏移量不会改变。 本函数在碰上空洞时不会报错,一个空洞0按一个字节计算,只要执行成功就会定位到相应的文件位置。
函数名: lseek 功 能: 移动文件读/写指针用 法: long lseek(int handle, long offset, int fromwhere);所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。使用 lseek 函数可以改变文件的 cfo 。lseek 的以下用法返回当前的偏移量:off_t currpos;currpos = lseek(fd, 0, SEEK_CUR);这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为 ESPIPE。对于普通文件(regular file),cfo 是一个非负整数。但对于特殊设备,cfo 有可能是负数。因此,我们不能简单地测试 lseek 的返回值是否小于 0 来判断 lseek 成功与否,而应该测试 lseek 的返回值是否等于 -1 来判断 lseek 成功与否。lseek 仅将 cfo 保存于内核中,不会导致任何 I/O 操作。这个 cfo 将被用于之后的读写操作。如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。编辑本段程序例#include #include #include #include #include #include int main(void){int handle;char msg[] = "This is a test";char ch;/* create a file */handle = open("TEST.$$$", O_CREAT | O_RDWR, S_IREAD | S_IWRITE);/* write some data to the file */write(handle, msg, strlen(msg));/* seek to the begining of the file */lseek(handle, 0L, SEEK_SET);/* reads chars from the file until we hit EOF */do{read(handle, &ch, 1);printf("%c", ch);} while (!eof(handle));close(handle);return 0;}追问:如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。还是没有回答返回值啊追答:返回值为0 空洞都被0填充 希采纳

fseek函数
fseek函数: int fseek(FILE *stream, long offset, int fromwhere);函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置,函数返回一个非0值。实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,返回-1,且指向一个-1的位置,请小心使用。fseek函数和lseek函数类似,但lseek返回的是一个off_t数值,而fseek返回的是一个整型。功能:重定位流(数据流/文件)上的文件内部位置指针。注意:文件指针指向文件/流。位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。程序例:#include long filesize(FILE*stream);int main(void){FILE *stream;stream=fopen("MYFILE.TXT","w+");fprintf(stream,"Thisisatest");printf("FilesizeofMYFILE.TXTis%ldbytesn",filesize(stream));fclose(stream);return 0;}long filesize(FILE*stream){long curpos,length;curpos=ftell(stream);fseek(stream,0L,SEEK_END);length=ftell(stream);fseek(stream,curpos,SEEK_SET);return length;}int fseek( FILE *stream, long offset, int origin );第一个参数stream为文件指针第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SETSEEK_SET: 文件开头SEEK_CUR: 当前位置SEEK_END: 文件结尾其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.简言之:fseek(fp,100L,0);把文件内部指针移动到离文件开头100字节处;fseek(fp,100L,1);把文件内部指针移动到离文件当前位置100字节处;fseek(fp,-100L,2);把文件内部指针退回到离文件结尾100字节处。使用实例:#include#defineN5typedefstructstudent{longsno;charname[10];floatscore[3];}STU;voidfun(char*filename,STUn){FILE*fp;fp=fopen(filename,"rb+");fseek(fp,-1L*sizeof(STU),SEEK_END);fwrite(&n,sizeof(STU),1,fp);fclose(fp);}voidmain()/*修改覆盖最后一个学生数据*/{STUt[N]={{10001,"MaChao",91,92,77},{10002,"CaoKai",75,60,88},{10003,"LiSi",85,70,78},{10004,"FangFang",90,82,87},{10005,"ZhangSan",95,80,88}};STUn={10006,"ZhaoSi",55,70,68},ss[N];inti,j;FILE*fp;fp=fopen("student.dat","wb");fwrite(t,sizeof(STU),N,fp);fclose(fp);fp=fopen("student.dat","rb");fread(ss,sizeof(STU),N,fp);fclose(fp);printf("nTheoriginaldata:nn");for(j=0;j是的 int fseek(FILE *stream, long offset, int fromwhere);函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置,函数返回一个非0值。实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,返回-1,且指向一个-1的位置,请小心使用。 fseek函数和lseek函数类似,但lseek返回的是一个off_t数值,而fseek返回的是一个整型。
feek(文件指针,位移量,起始点) SEEK-END的数字表示就是2,既文件末尾
定位文件尾。注意此时并不是定位到文件的最后一字符,而是在定位文件最后一个字符之后的位置
首先:fseek函数的功能是,重定位流上的文件指针。 例如,#include"stdio.h"fseek(文件类型指针fp,位移量,起始点);函数功能:把与fp有关的文件位置指针放到一个指定位置。SEEK_SET 代表文件开头SEEK_CUR 代表文件当前位置SEEK_END 代表文件末尾例如:fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET);其作用是将位置指针移到离文件头50个字节处。 所以根据你的提问,确实是你所理解的将fp指针移到到文件结尾。

read pread write pwrite fseek lseek是同一类函数吗
lseek是库函数。 库函数就是C++最基本的函数,也就是说没有这些东西无法定义C++。 C++的制定标准,并不决定库函数的底层是如何实现的,主要决定实现结果和大致逻辑。 所以,对于不同系统不同型号机器的lseek,它的实现是不一样的。 在大多数系统

问一个关于lseek函数的效率问题
lseek是库函数。 库函数就是C++最基本的函数,也就是说没有这些东西无法定义C++。C++的制定标准,并不决定库函数的底层是如何实现的,主要决定实现结果和大致逻辑。所以,对于不同系统不同型号机器的lseek,它的实现是不一样的。在大多数系统中,lssek的执行只是改变一个内存中的值。计算机读取磁盘很慢,而内存很快,于是操作系统在内存中会事先保存好多值,当下一个读盘周期开始的时候,计算机会以最优化的读取顺序读取内存中设置的磁盘位置,lssek改变的就是那个位置。 所以耗时依赖你的系统和硬件,10000 比100未必慢

为什么C语言中read函数和write函数间要用lseek来调整读取顺序
-由于程序在打开文件时文件操作指针位于文件起始位置,即偏移量0 -读取了1个字符的内容给变量c,文件指针偏移量为1-这时如果想将c值写到文件开始位置,则需要移动文件指针到文件开始-于是lseek就是移动文件当前指针的语句,它通知系统将文件指针移动到从文件开始位置(SEEK_SER)起的第0字节 -这个程序比较奇怪,明明打开文件时选用了0_WRONLY参数,表明这个打开是只写的,但上来就读

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/43830.html。