c语言偏移一个字节,文件偏移量与C语言中的流定位
一、文件偏移量
1、每個打開的文件都有一個與其相關聯的“當前文件偏移量”。它通常是一個非負整數,用以度量從文件開始處計算的字節數。
2、內核為所有打開的文件維持一張文件表。文件表項包含文件偏移量。
3、默認情況下,當打開一個文件時,除非指定O_APPEND選項,否則偏移量為0。
4、讀、寫操作都是從當前文件偏移量處開始,并使偏移量被設置為0.
5、兩個進程打開同一個文件時,每個進程都會有自己的文件表項(只有一個V節點),都有自己對該文件的當前文件偏移量。
6、文件的定位可以大于文件的當前長度,此時,對文件的下一次寫將加長該文件,并在文件中構成一個空洞。位于文件中但沒有寫過的字節都被讀為0。文件中的空洞并不要求在磁盤上占用存儲區。
7、文件的當前偏移量可能為負值。但是普通文件的當前偏移量必須為非負值。
8、管道型文件(比如fifo、socket、pipe)不可以設置文件位置偏移量。
二、定位標準I/O流
1、ftell
long ftell(
FILE* stream
);
測試文件的當前位置。成功時返回當前文件位置指示,若出錯返回-1L.
2、fseek
定位文件位置。
(1)函數原型
int fseek(
FILE* stream,
long offset,
int origin
);
(2)參數
offset:離origin的偏移字節
origin:SEEK_CUR:文件當前位置;SEEK_END:文件尾;SEEK_SET:文件開頭
(3)返回值
成功時返回0;失敗時返回-1.
因為偏移量可能為負值,因此測試時不要測試是否小于0,而要測試是否等于-1。
(4)說明
1)對于文本文件,它們的當前位置可能不能以簡單的字節偏移量來衡量。因為可能以不同格式存放文本文件。
為了定位文本文件,origin必須為SEEK_SET,offset只能為0,或是對該文件的ftell返回的值。
2)對于二進制文件,文件位置指示器是從文件起始位置開始度量,并以字節為度量單位。ftell用于二進制文件時,其返回值就是字節位置。
ISO C中并不要求對二進制文件支持SEEK_END,因為有些系統要求二進制文件的長度是某個幻數的整數倍,結尾非實際內容部分則填充為0.但是在UNIX中,對于二進制文件支持SEEK_END。
3)在文本文件中,輸入時最后的CTRL+Z被解釋為文件尾的字符。
使用fopen打開文件時,會檢測最后的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
);
將一個流設置到文件的起始位置。
4、fgetpos、fsetpos
int fgetpos(
FILE *stream,
fpos_t *pos
);
int fsetpos(
FILE *stream,
const fpos_t *pos
);
(1)說明
這兩個函數是ISO C引入的,使用抽象數據類型fpos_t記錄文件位置。這種數據類型可以根據需要定義為一個足夠大的數,用以記錄文件位置。
需要移植到非UNIX系統上運行的應用程序應當使用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 );
}
總結
以上是生活随笔為你收集整理的c语言偏移一个字节,文件偏移量与C语言中的流定位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux技术理解,技术|理解 Linu
- 下一篇: 旅行商问题c语言,【算法作业】用回溯法求