日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

c语言偏移一个字节,文件偏移量与C语言中的流定位

發(fā)布時(shí)間:2024/9/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言偏移一个字节,文件偏移量与C语言中的流定位 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、文件偏移量

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。