UNIX中文件I/O注意的地方
1.lseek
作用:移动文件指针,并且返回当前指针的值!
off_t   lseek(int filedes, off_to ffset, int whence) ;
对参数offset 的解释与参数whence的值有关。
• 若whence是SEEK_SET,则将该文件的位移量设置为距文件开始处offset 个字节。
• 若whence是SEEK_CUR,则将该文件的位移量设置为其当前值加offset, offset可为正或负。
• 若whence是SEEK_END,则将该文件的位移量设置为文件长度加offset, offset可为正或负。
若lseek成功执行,则返回新的文件位移量,为此可以用下列方式确定一个打开文件的当前
位移量:
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
下列是教特别的使用方式:
- 欲将读写位置移到文件开头时:lseek(int fildes, 0, SEEK_SET);
- 欲将读写位置移到文件尾时:lseek(int fildes, 0, SEEK_END);
- 想要取得目前文件位置时:lseek(int fildes, 0, SEEK_CUR);
返回值:当调用成功时则返回目前的读写位置, 也就是距离文件开头多少个字节. 若有错误则返回-1, errno 会存放错误代码.
三个符号常数SEEKSET,SEEKCUR和SEEKEND是由系统V引进的。在系统V之前, whence被指定为0 (绝对位移量),1 ( 相对于当前位置的位移量)或2 (相对文件尾端的位移量)。很多软件仍直接使用这些数字进行编码。
定位流:
ftell和fseek。
fgetpos和fsetpos。
fseek()函数:移动文件流的读写位置
头文件:
include <stdio.h>
定义函数:
int fseek(FILE * stream, long offset, int whence);
函数说明:
fseek()用来移动文件流的读写位置.
1、参数stream 为已打开的文件指针,
2、参数offset 为根据参数whence 来移动读写位置的位移数。参数 whence 为下列其中一种:
SEEK_SET 从距文件开头offset 位移量为新的读写位置. SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或
SEEK_END 时, 参数offset 允许负值的出现.
下列是较特别的使用方式:
- 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
- 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, 0SEEK_END);
返回值:当调用成功时则返回0, 若有错误则返回-1, errno 会存放错误代码.
Tips:fseek()不像lseek()会返回读写位置, 因此必须使用ftell()来取得目前读写的位置.
函数名: ftell
- 头文件
- <stdio.h>
 功 能
- 返回当前文件位置,也就是说返回FILE指针当前位置。
 函数原型
- long ftell(FILE *stream);
 函数功能
 :函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。使用fseek函数后再调用函数ftell()就能非常容易地确定文件的当前位置。
调用示例
ftell(fp);利用函数 ftell() 也能方便地知道一个文件的长。如以下语句序列: fseek(fp, 0L,SEEK_END); len =ftell(fp)+1; 首先将文件的当前位置移到文件的末尾,然后调用函数ftell()获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。
程序示例
举例1:
#include <stdio.h>
int main(void)
{
FILE *stream;
stream = fopen("MYFILE.TXT", "w+");
fprintf(stream, "This is a test");
printf("The file pointer is at byte \
%ld\n", ftell(stream));
fclose(stream);
return 0;
}
举例2: 
ftell一般用于读取文件的长度,下面补充一个例子,读取文本文件中的内容:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int flen;
char *p;
/* 以只读方式打开文件 */
if((fp = fopen ("1.txt","r"))==NULL)
{
printf("\nfile open error\n");
exit(0);
}
fseek(fp,0L,SEEK_END); /* 定位到文件末尾 */
flen=ftell(fp); /* 得到文件大小 */
p=(char *)malloc(flen+1); /* 根据文件大小动态分配内存空间 */
if(p==NULL)
{
fclose(fp);
return 0;
}
fseek(fp,0L,SEEK_SET); /* 定位到文件开头 */
fread(p,flen,1,fp); /* 一次性读取全部文件内容 */
p[flen]=0; /* 字符串结束标志 */
printf("%s",p);
fclose(fp);
free(p);
return 0;
}
程序改进
#include <stdio.h>
main()
{
FILE *myf;
long f1;
myf=fopen("1.txt","rb");
fseek(myf,0,SEEK_END);
f1=ftell(myf);
fclose(myf);
printf(“%d\n”,f1);
}
 
函数名: rewind()
功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头
注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。
rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET);[1]
用 法: void rewind(FILE *stream);
头文件: stdio.h
返回值:无
英文解释: A statement such as
rewind( cfptr );
causes a program's file position--which indicates the number of the next byte in the file to be read or written-- to be repositioned to the beginnning of the file pointed to by cfptr.
程序例:
#include <stdio.h>
#include <dir.h>
int main(void)
{
FILE *fp;
char fname[10] = "TXXXXXX", *newname, first;
newname = mktemp(fname);
fp = fopen(newname,"w+");
if(NULL==fp)
return 1;
fprintf(fp,"abcdefghijklmnopqrstuvwxyz");
rewind(fp);
fscanf(fp,"%c",&first);
printf("The first character is: %c\n",first);
fclose(fp);
remove(newname);
return 0;
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号