輸出——fseek\fflush\sprintf

上一節主要講解了文件的打開、關閉、讀取和寫入操作。

這一節講解流\文件的 讀寫位置\刷新等操作。

移動文件流的讀寫位置:fseek()

作用:把與stream有關的文件位置指針放到一個指定位置

原型:int fseek(FILE *stream, long offset, int fromwhere);

返回值:如果執行成功,stream將指向以fromwhere為基準,偏移offset(指針偏移量)個字節的位置,函數返回0。如果執行失敗(比如offset超過文件自身大小),則不改變stream指向的位置,函數返回一個非0值。

範例一:fseek(fp, 0L, SEEK_END);

解釋:文件指針定位到文件末尾,偏移0個字節

範例二: fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET);

解釋:其作用是將位置指針移到離文件頭50個字節處。



示例

#include
#include
int main(void)
{
FILE*stream;
char msg[]="this is a test";
char buf[20];
if((stream=fopen("big_cat.txt","w+"))==NULL)
{
fprintf(stderr,"Can not open output file.\n");
return 0;
}
/*write some data to the file*/
fwrite(msg,strlen(msg)+1,1,stream);
/*sizeof(char)=1 seek to the beginning of the file*/
fseek(stream,0,SEEK_SET);
/*read the data and display it*/
fread(buf,strlen(msg)+1,1,stream);
printf("%s\n",buf);
fclose(stream);
return 0;
}

說明:這裡fseek就是把stream指針定位到文件末尾


緩衝區強制物理寫入:fflush()

說明:fwrite寫完後,內容是放在緩衝區中,需要等Linux自動刷新到文件中,但是有時,Linux刷新沒那麼及時,會導致我們的數據沒有真正寫入到文件,從而發生一些異常,這時就要用到fflush()來把數據強行物理寫入。

作用:fflush()用來清除讀寫緩衝區,需要立即把輸出緩衝區的數據進行物理寫入。

原型:int fflush(FILE *stream);

返回值:成功,返回0;失敗,返回EOF(-1)。

示例:

#include 
int main ()
{
FILE * pFile;
char buffer[] = { 'x' , 'y' , 'z' };
pFile = fopen ( "tianger.txt" , "wb" );
fwrite (buffer , sizeof(buffer), 1 , pFile ); //寫完後,內容暫時存在緩衝區
fflush(pFile); //強行寫入物理文件
fclose (pFile);
return 0;
}


格式化字符:sprintf():

說明:sprintf()是字符串格式化命令,主要功能是把格式化的數據寫入某個字符串中,它是一個可變參數函數。

原型:int sprintf(char buffer,char const format, …)

參數

buffer:char型指針,指向將要寫入的字符串的緩衝區。

format:格式化字符串。

[argument]…:可選參數,可以是任何類型的數據。

返回值

返回寫入buffer 的字符數,出錯則返回-1. 如果 buffer 或 format 是空指針,且不出錯而繼續,函數將返回-1,並且 errno 會被設置為 EINVAL。

sprintf 返回被寫入buffer 的字節數,結束字符‘\0’不計入內。即,如果“Hello”被寫入空間足夠大的buffer後,函數sprintf 返回5。

示例:

#include 
int main( void )
{
char buffer[200], s[] = "computer", c = 'l';
int i = 35, j;
float fp = 1.7320534f;
// 格式化並打印各種數據到buffer
j = sprintf( buffer, " String: %s\n", s );
j += sprintf( buffer + j, " Character: %c\n", c );
j += sprintf( buffer + j, " Integer: %d\n", i );
j += sprintf( buffer + j, " Real: %f\n", fp );
printf( "Output:\n%s\ncharacter count = %d\n",buffer,j );
}


輸出:

String: computer
Character: l
Integer: 35
Real: 1.732053
character count = 74


「C與指針心得」27. I/O輸入/輸出——fseek\fflush\sprintf


分享到:


相關文章: