讀取文件操作的標準I/O函數

讀取文件操作的標準I/O函數

fopen
函數定義:FILE *fopen(const char *path,const char *mode)
參數說明:path爲指定文件的路徑,mode爲打開模式,取值可以爲r、r+、w、w+、a、a+。
功能說明:以mode方式打開path文件。

fread
函數定義:size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
參數說明:ptr爲用來存放讀取到的字節的緩衝區,size*nmemb爲讀取到的字符數,stream爲當前打開的文件流。
功能說明:從stream中讀取size*nmemb個字節到ptr中,返回實際讀取到的字節數。

feof
函數定義:int feof(FILE *stream)
參數說明:stream爲當前打開的文件流。
功能說明:判斷是否是文件末尾,否則返回0,是則返回非0。

在網上找了個例子,如下所示:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
void read(char *argv);
int main(int argc,char *argv[]){
    printf("\n\n***************你輸入了 %d 個文件***************\n\n",argc-1);
    int m = 0;
    for(m = 1;m < argc;m++){
        printf("\n***********第 %d 個文件的內容如下所示************\n",m);

        read(argv[m]);
        printf("\n***************************************************\n\n");
    }
}
void read(char *argv){
    FILE *fd;
        int i = 0, j = 0, y = 0, k = 0;
        char buf;

/**
*********************************************************************************************************
*   根據鍵入的參數(argv[1]),傳入一個文件名稱,打開這個文件,獲取到這個文件的相關參數:文件字符數,行數 *
*********************************************************************************************************
*/

        fd = fopen(argv, "r");               // 以只讀方式打開argv指定的文件
        if (fd == NULL) {                    // 如果沒有獲取到指定文件的指針
            printf("打開文件失敗!\n");    // 提示打開文件失敗,正常退出
            exit(0);
        } else {            // 已經成功打開文件,進一步進行讀取
            printf("打開文件成功!現在開始讀文件參數信息...\n");
            while (1) {                    // 設置while循環,連續讀取文件內容
                    if ((fread(&buf, 1, 1, fd)) == 0) {        //每一次從文件中讀取一個字節放到字符緩衝區buf中
                        if (!feof(fd))                // 通過文件指針fd判斷是否讀取到文件最後,如果不是在最後就明在這裏讀文件出錯
                                printf("讀取文件參數信息失敗!\n");        //然後打印出來
                    goto fin;                //確認是讀文件到最後,然後跳到fin去執行
                    } else {                    //讀文件成功
                        i++;                    //計算出i的值然後可以知道一個文件中有多少字節,就是i的值啦
                        if (buf == 0x0a)            //判斷是否讀到了換行符,0a是十六進,表示換行
                                j++;                //每換一次行給j加一次,從而可知一共有多少行
                        }
            }
        }

/**
* ************************************************************************************************************
*   *                             讀取文件的內容,並將內容存放到數組x中                                        *
*    ************************************************************************************************************
*/

fin:                            //實現goto語句
        fclose(fd);                        //關閉上面打開的文件
        char x[i + 1];                    //爲文件動態地分配內存
        memset(x, 0, i + 1);                //先清空
        fd = fopen(argv, "r");
        memset(x, 0, i + 1);
        fd = fopen(argv,"r");
        if (fd == NULL) {
            printf("打開文件成功!接着進行讀取文件操作。\n");
            exit(0);
        } else {
            printf("開始讀取文件內容...\n");
            while (1) {
                    if ((fread(&buf, 1, 1, fd)) == 0) {
                        if (!feof(fd))
                                printf("讀取文件內容失敗!\n");
                        goto finish;
                    } else {
                        x[y++] = buf;                //把所有字符讀到x數組中
                    }
            }
        }

/**
********************************************************************************************************
*                            打印輸出數組x中讀取到的文件內容                                           *
********************************************************************************************************
*     */
finish:
    printf("讀取文件操作結束!\n");
    printf("共有%d行,%d個字符\n", j, i);            //打印出行數和字符總數
    printf("字符內容是:%s", x);                //打印文章中的內容
    y = -1;
    for (k = 0; k < j; k++) {
            printf("\n第%d行是:\n", k + 1);
            for (y = y + 1; y < i; y++) {
                    if (x[y] == 0x0a)                //當碰到換行符時結束,跳到上面去打印出行號
                        break;
                printf("%c", x[y]);                //打印出每一行的字符
            }
    }
    fclose(fd);


}


編譯:

[root@host C]# gcc -o read read.c

運行:

[root@host C]# ./read hello.c matrix.c

保證當前目錄下存在上面輸入的兩個文件,讀取文件的結果如下所示:


***************你輸入了 2 個文件***************


***********第 1 個文件的內容如下所示************
打開文件成功!現在開始讀文件參數信息...
開始讀取文件內容...
讀取文件操作結束!
共有6行,82個字符
字符內容是:#include <stdio.h>
int main()
{
        printf("\nHello,the world!!!\n\n");
        return 0;
}

第1行是:
#include <stdio.h>
第2行是:
int main()
第3行是:
{
第4行是:
        printf("\nHello,the world!!!\n\n");
第5行是:
        return 0;
第6行是:
}
***************************************************


***********第 2 個文件的內容如下所示************
打開文件成功!現在開始讀文件參數信息...
開始讀取文件內容...
讀取文件操作結束!
共有29行,295個字符
字符內容是:#include <stdio.h>
……


最後說明:

主函數int main(int argc,char *argv[])聲明中,argc表示在控制檯中輸入的參數的個數,argv[]用來存放argc個參數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章