標準輸入輸出服從規則和fileno,freopen,fdopen,ftell,fseek,rewind幾個函式

wzm10455發表於2013-01-15
/*
 ============================================================================
 Name        : quanhaunchong.c
 Author      :
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>//標準io庫,服從全緩衝
#include <stdlib.h>
//所有使用stdio這個庫的輸入輸出都得滿足這個全緩衝,行緩衝,不緩衝的規則。
//全緩衝:緩衝區內容滿了,才能寫道檔案中去,但是遇到return時會將緩衝區的內容強制寫道要寫道的檔案中去
//行緩衝:只要是遇到‘\n’時,就講緩衝區的內容寫道指定檔案中去
//不緩衝:這是特指stderr,標準出錯輸出時不經過緩衝區直接寫道標準輸入輸出中
int main(void) {
    //全緩衝
    printf("helloworld");
    //fflush(stdout);//不滿也寫道標準輸出裡面中去,這是解決全緩衝的辦法
    
    
    //行緩衝
    printf("helloworld\n");
    int i;
    for(i=0;i<2;i++)
        {
            printf("helloworl");
        }
    //不緩衝,輸出的字為紅色,顯示為錯誤
    fputs("hell9",stderr);
    while(1);
    return EXIT_SUCCESS;//程式退出會將緩衝區的內容強制重新整理到想要寫的檔案中去
}


fdopen:



fdopen(將檔案描述詞轉為檔案指標)
相關函式
fopen,open,fclose
表標頭檔案
#include<stdio.h>
定義函式
FILE * fdopen(int fildes,const char * mode);
函式說明
fdopen()會將引數fildes 的檔案描述詞,轉換為對應的檔案指標後返回。引數mode 字串則代表著檔案指標的流形態,此形態必須和原先檔案描述詞讀寫模式相同。關於mode 字串格式請參考fopen()。
返回值
轉換成功時返回指向該流的檔案指標。失敗則返回NULL,並把錯誤程式碼存在errno中。
範例
#include<stdio.h>
main()
{
FILE * fp =fdopen(0,”w+”);
fprintf(fp,”%s\n”,”hello!”);
fclose(fp);
}
執行
hello!

freopen:



freopen(開啟檔案)
相關函式
fopen,fclose
表標頭檔案
#include<stdio.h>
定義函式
FILE * freopen(const char * path,const char * mode,FILE * stream);
函式說明
引數path字串包含欲開啟的檔案路徑及檔名,引數mode請參考fopen()說明。引數stream為已開啟的檔案指標。Freopen()會將原stream所開啟的檔案流關閉,然後開啟引數path的檔案。
返回值
檔案順利開啟後,指向該流的檔案指標就會被返回。如果檔案開啟失敗則返回NULL,並把錯誤程式碼存在errno 中。
範例
#include<stdio.h>
main()
{
FILE * fp;
fp=fopen(“/etc/passwd”,”r”);
fp=freopen(“/etc/group”,”r”,fp);
fclose(fp);
}

fileno:



fileno(返回檔案流所使用的檔案描述詞)
相關函式
open,fopen
表標頭檔案
#include<stdio.h>
定義函式
int fileno(FILE * stream);
函式說明
fileno()用來取得引數stream指定的檔案流所使用的檔案描述詞。
返回值
返回檔案描述詞。
範例
#include<stdio.h>
main()
{
FILE * fp;
int fd;
fp=fopen(“/etc/passwd”,”r”);
fd=fileno(fp);
printf(“fd=%d\n”,fd);
fclose(fp);
}
執行
fd=3
 

/*
 ============================================================================
 Name        : CDX.c
 Author      :
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(void) {
    FILE *fp=NULL;


    //重定向cat main.c>txt:將mian,c裡面的內容輸入到txt裡面去
    fp=fopen("hello.txt","w");
    if(fp==NULL)
    {
        perror("open error");
        return 0;
    }
//    fp=freopen(“/etc/group”,”r”,fp);
    freopen("world.txt","w+",fp);
    fputs("helloweotd",fp);


    //fieno
    int fd;
    fd=fileno(fp);
    printf("fd=%d\n",fd);
    fclose(fp);
    FILE * fp1 =fdopen(0,"w+");
    fprintf(fp1,"%s\n","hello!");
    //puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
    return EXIT_SUCCESS;
}


ftell:



ftell(取得檔案流的讀取位置)
相關函式
fseek,rewind,fgetpos,fsetpos
表標頭檔案
#include<stdio.h>
定義函式
long ftell(FILE * stream);
函式說明
ftell()用來取得檔案流目前的讀寫位置。引數stream為已開啟的檔案指標。
返回值
當呼叫成功時則返回目前的讀寫位置,若有錯誤則返回-1,errno會存放錯誤程式碼。
錯誤程式碼
EBADF 引數stream無效或可移動讀寫位置的檔案流。
範例
參考fseek()。
fseek:



fseek(移動檔案流的讀寫位置)
相關函式
rewind,ftell,fgetpos,fsetpos,lseek
表標頭檔案
#include<stdio.h>
定義函式
int fseek(FILE * stream,long offset,int whence);
函式說明
fseek()用來移動檔案流的讀寫位置。引數stream為已開啟的檔案指標,引數offset為根據引數whence來移動讀寫位置的位移數。
引數
whence為下列其中一種:
SEEK_SET從距檔案開頭offset位移量為新的讀寫位置。SEEK_CUR 以目前的讀寫位置往後增加offset個位移量。
SEEK_END將讀寫位置指向檔案尾後再增加offset個位移量。
當whence值為SEEK_CUR 或SEEK_END時,引數offset允許負值的出現。
下列是較特別的使用方式:
1) 欲將讀寫位置移動到檔案開頭時:fseek(FILE *stream,0,SEEK_SET);
2) 欲將讀寫位置移動到檔案尾時:fseek(FILE *stream,0,0SEEK_END);
返回值
當呼叫成功時則返回0,若有錯誤則返回-1,errno會存放錯誤程式碼。
附加說明
fseek()不像lseek()會返回讀寫位置,因此必須使用ftell()來取得目前讀寫的位置。
rewind:



rewind(重設檔案流的讀寫位置為檔案開頭)
相關函式
fseek,ftell,fgetpos,fsetpos
表標頭檔案
#include<stdio.h>
定義函式
void rewind(FILE * stream);
函式說明
rewind()用來把檔案流的讀寫位置移至檔案開頭。引數stream為已開啟的檔案指標。此函式相當於呼叫fseek(stream,0,SEEK_SET)。
返回值

範例
參考fseek()
 

#include <stdio.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

int main(int argc,char **argv) {
    //函式:fseek(file *stream,long off_set,int wherece)可以使檔案指標移到檔案中的指定位置
    //long ftell(file *stream,fpos_t *pos);
    FILE *fp;
    int i;
    char buf[9][10];
    fp=fopen("/home/wzm/workspace1/filesuiji/src/tab.dat","r");
    if(fp==NULL)
    {
        perror("open error");
        return -1;
    }
    //把檔案指標移動30個位置
    fseek(fp,30,SEEK_SET);
    //輸出當前的指標位置
    printf("current file position[%ld]\n",ftell(fp));
    for(i=0;i<6;i+=3)
    {
        fscanf(fp,"%10s%10s%10s\n",buf[i],buf[i+1],buf[i+2]);
        printf(fp,"%s%s%s\n",buf[i],buf[i+1],buf[i+2]);
    }
    fclose(fp);
    return EXIT_SUCCESS;
}



相關文章