c语言偏移一个字节,文件偏移量与C语言中的流定位
一、文件偏移量
1、每個(gè)打開的文件都有一個(gè)與其相關(guān)聯(lián)的“當(dāng)前文件偏移量”。它通常是一個(gè)非負(fù)整數(shù),用以度量從文件開始處計(jì)算的字節(jié)數(shù)。
2、內(nèi)核為所有打開的文件維持一張文件表。文件表項(xiàng)包含文件偏移量。
3、默認(rèn)情況下,當(dāng)打開一個(gè)文件時(shí),除非指定O_APPEND選項(xiàng),否則偏移量為0。
4、讀、寫操作都是從當(dāng)前文件偏移量處開始,并使偏移量被設(shè)置為0.
5、兩個(gè)進(jìn)程打開同一個(gè)文件時(shí),每個(gè)進(jìn)程都會(huì)有自己的文件表項(xiàng)(只有一個(gè)V節(jié)點(diǎn)),都有自己對(duì)該文件的當(dāng)前文件偏移量。
6、文件的定位可以大于文件的當(dāng)前長(zhǎng)度,此時(shí),對(duì)文件的下一次寫將加長(zhǎng)該文件,并在文件中構(gòu)成一個(gè)空洞。位于文件中但沒(méi)有寫過(guò)的字節(jié)都被讀為0。文件中的空洞并不要求在磁盤上占用存儲(chǔ)區(qū)。
7、文件的當(dāng)前偏移量可能為負(fù)值。但是普通文件的當(dāng)前偏移量必須為非負(fù)值。
8、管道型文件(比如fifo、socket、pipe)不可以設(shè)置文件位置偏移量。
二、定位標(biāo)準(zhǔn)I/O流
1、ftell
long ftell(
FILE* stream
);
測(cè)試文件的當(dāng)前位置。成功時(shí)返回當(dāng)前文件位置指示,若出錯(cuò)返回-1L.
2、fseek
定位文件位置。
(1)函數(shù)原型
int fseek(
FILE* stream,
long offset,
int origin
);
(2)參數(shù)
offset:離origin的偏移字節(jié)
origin:SEEK_CUR:文件當(dāng)前位置;SEEK_END:文件尾;SEEK_SET:文件開頭
(3)返回值
成功時(shí)返回0;失敗時(shí)返回-1.
因?yàn)槠屏靠赡転樨?fù)值,因此測(cè)試時(shí)不要測(cè)試是否小于0,而要測(cè)試是否等于-1。
(4)說(shuō)明
1)對(duì)于文本文件,它們的當(dāng)前位置可能不能以簡(jiǎn)單的字節(jié)偏移量來(lái)衡量。因?yàn)榭赡芤圆煌袷酱娣盼谋疚募?/p>
為了定位文本文件,origin必須為SEEK_SET,offset只能為0,或是對(duì)該文件的ftell返回的值。
2)對(duì)于二進(jìn)制文件,文件位置指示器是從文件起始位置開始度量,并以字節(jié)為度量單位。ftell用于二進(jìn)制文件時(shí),其返回值就是字節(jié)位置。
ISO C中并不要求對(duì)二進(jìn)制文件支持SEEK_END,因?yàn)橛行┫到y(tǒng)要求二進(jìn)制文件的長(zhǎng)度是某個(gè)幻數(shù)的整數(shù)倍,結(jié)尾非實(shí)際內(nèi)容部分則填充為0.但是在UNIX中,對(duì)于二進(jìn)制文件支持SEEK_END。
3)在文本文件中,輸入時(shí)最后的CTRL+Z被解釋為文件尾的字符。
使用fopen打開文件時(shí),會(huì)檢測(cè)最后的CTRL+Z,并把它移除。
(5)示例
/* FSEEK.C: This program opens the file FSEEK.OUT and
* moves the pointer to the file's beginning.
*/
#include void main( void )
{
FILE *stream;
char line[81];
int result;
stream = fopen( "fseek.out", "w+" );
if( stream == NULL )
printf( "The file fseek.out was not opened\n" );
else
{
fprintf( stream, "The fseek begins here: "
"This is the file 'fseek.out'.\n" );
result = fseek( stream, 23L, SEEK_SET);
if( result )
printf( "Fseek failed" );
else
{
printf( "File pointer is set to middle of first line.\n" );
fgets( line, 80, stream );
printf( "%s", line );
}
fclose( stream );
}
}
3、rewind
void rewind(
FILE *stream
);
將一個(gè)流設(shè)置到文件的起始位置。
4、fgetpos、fsetpos
int fgetpos(
FILE *stream,
fpos_t *pos
);
int fsetpos(
FILE *stream,
const fpos_t *pos
);
(1)說(shuō)明
這兩個(gè)函數(shù)是ISO C引入的,使用抽象數(shù)據(jù)類型fpos_t記錄文件位置。這種數(shù)據(jù)類型可以根據(jù)需要定義為一個(gè)足夠大的數(shù),用以記錄文件位置。
需要移植到非UNIX系統(tǒng)上運(yùn)行的應(yīng)用程序應(yīng)當(dāng)使用fgetpos和fsetpos
(2)示例
// crt_fgetpos.c
// This program uses fgetpos and fsetpos to
// return to a location in a file.
#include int main( void )
{
FILE *stream;
fpos_t pos;
char buffer[20];
if( fopen_s( &stream, "crt_fgetpos.txt", "rb" ) ) {
perror( "Trouble opening file" );
return -1;
}
// Read some data and then save the position.
fread( buffer, sizeof( char ), 8, stream );
if( fgetpos( stream, &pos ) != 0 ) {
perror( "fgetpos error" );
return -1;
}
fread( buffer, sizeof( char ), 13, stream );
printf( "after fgetpos: %.13s\n", buffer );
// Restore to old position and read data
if( fsetpos( stream, &pos ) != 0 ) {
perror( "fsetpos error" );
return -1;
}
fread( buffer, sizeof( char ), 13, stream );
printf( "after fsetpos: %.13s\n", buffer );
fclose( stream );
}
總結(jié)
以上是生活随笔為你收集整理的c语言偏移一个字节,文件偏移量与C语言中的流定位的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux技术理解,技术|理解 Linu
- 下一篇: 旅行商问题c语言,【算法作业】用回溯法求