C教程-----輸入輸出函數(shù)及控制流程語句(3)

字號:

3. 文件的隨機讀寫
    有時用戶想直接讀取文件中間某處的信息, 若用文件的順序讀寫必須從文件
    頭開始直到要求的文件位置再讀, 這顯然不方便。Turbo C2.0提供了一組文件的
    隨機讀寫函數(shù), 即可以將文件位置指針定位在所要求讀寫的地方直接讀寫。
    文件的隨機讀寫函數(shù)如下:
    int fseek (FILE *stream, long offset, int fromwhere);
    int fread(void *buf, int size, int count, FILE *stream);
    int fwrite(void *buf, int size, int count, FILE *stream);
    long ftell(FILE *stream);
    fseek()函數(shù)的作用是將文件的位置指針設置到從fromwhere開始的第offset
    字節(jié)的位置上, 其中fromwhere是下列幾個宏定義之一:
    文件位置指針起始計算位置fromwhere
    符號常數(shù) 數(shù)值 含義
    SEEK_SET 0 從文件開頭
    SEEK_CUR 1 從文件指針的現(xiàn)行位置
    SEEK_END 2 從文件末尾
    offset是指文件位置指針從指定開始位置(fromwhere指出的位置)跳過的字
    節(jié)數(shù)。它是一個長整型量, 以支持大于64K字節(jié)的文件。fseek()函數(shù)一般用于對
    二進制文件進行操作。
    當fseek()函數(shù)返回0時表明操作成功, 返回非0表示失敗。
    下面程序從二進制文件test_b.dat中讀取第8個字節(jié)。
    例13:
    #include
    main()
    {
    FILE *fp;
    if((fp=fopen("test_b.dat", "rb"))==NULL)
    {
    printf("Can’t open file");
    exit(1);
    }
    fseek(fp, 8. 1, SEEK_SET);
    fgetc(fp);
    fclose(fp);
    }
    fread()函數(shù)是從文件中讀count個字段, 每個字段長度為size個字節(jié), 并把
    它們存放到buf指針所指的緩沖器中。
    fwrite()函數(shù)是把buf指針所指的緩沖器中, 長度為size個字節(jié)的count個字
    段寫到stream指向的文件中去。
    隨著讀和寫字節(jié)數(shù)的增大, 文件位置指示器也增大, 讀多少個字節(jié), 文件位
    置指示器相應也跳過多少個字節(jié)。讀寫完畢函數(shù)返回所讀和所寫的字段個數(shù)。
    ftell()函數(shù)返回文件位置指示器的當前值, 這個值是指示器從文件頭開始
    算起的字節(jié)數(shù), 返回的數(shù)為長整型數(shù), 當返回-1時, 表明出現(xiàn)錯誤。
    下面程序把一個浮點數(shù)組以二進制方式寫入文件test_b.dat中。
    例14:
    #include
    main()
    {
    float f[6]={3.2, -4.34, 25.04, 0.1, 50.56, 80.5};
    /*定義浮點數(shù)組并初始化*/
    int i;
    FILE *fp;
    fp=fopen("test_b.dat", "wb"); /*創(chuàng)建一個二進制文件只寫*/
    fwrite(f, sizeof(float), 6, fp);/*將6個浮點數(shù)寫入文件中*/
    fclose(fp); /*關閉文件*/
    }
    下面例子從test_b.dat文件中讀100個整型數(shù), 并把它們放到dat數(shù)組中。
    例15:
    #include
    main()
    {
    FILE *fp;
    int dat[100];
    fp=fopen("test_b.dat", "rb");/*打開一個二進制文件只讀*/
    if(fread(dat, sizeof(int), 100, fp)!=100)
    /*判斷是否讀了100個數(shù)*/
    {
    if(feof(fp))
    printf("End of file"); /*不到100個數(shù)文件結束*/
    else
    printf("Read error"); /*讀數(shù)錯誤*/
    fclose(fp); /*關閉文件*/
    }