1. 程式人生 > >C語言fgets讀取整個文字檔案的內容

C語言fgets讀取整個文字檔案的內容

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int test_fgets(const char* filePath)
{

    FILE* fp=fopen(filePath,"r");
    if(fp==NULL)
    {
        printf("open error!%s",strerror(errno));
        return -1;
    }
    char buffer[2048]={0};
    while(fgets(buffer,sizeof(buffer),fp))
    {
        printf("%s",buffer);
    }
    fclose(fp);
    return 0;
}

char* getAllFileData2(char *filePath)
{
    FILE *fp;
    char *str;
    char buffer[4096];
    int filesize;
    if ((fp=fopen(filePath,"r"))==NULL){
        printf("開啟檔案%s錯誤 error=%s \n",filePath,strerror(errno));
        return NULL;
    }

    fseek(fp,0,SEEK_END);
    filesize = ftell(fp);
    str=(char *)malloc(filesize+1);
    memset(str,0,filesize+1);
    rewind(fp);
    int bufsize=sizeof(buffer);
    //fgets的快取大小隻能為bufsize? 如果一個行資料很長怎麼辦?
    while((fgets(buffer,bufsize,fp))!=NULL){ //每次最多讀取bufsize-1個字元
        strcat(str,buffer);
    }
    fclose(fp);
    return str;
}

char* getAllFileData(char *filePath)
{
    FILE *fp;
    char *str;
    char buffer[4096];
    int filesize;
    if ((fp=fopen(filePath,"r"))==NULL){
        printf("開啟檔案%s錯誤 error=%s \n",filePath,strerror(errno));
        return NULL;
    }

    fseek(fp,0,SEEK_END);
    filesize = ftell(fp);
    str=(char *)malloc(filesize+1);
    memset(str,0,filesize+1);
    rewind(fp);
    int bufsize=sizeof(buffer);
    //fgets函式成功將返回buf,失敗或讀到檔案結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函式是否是出錯而終止的,應該藉助feof函式或者ferror函式來判斷。
    while(!feof(fp)){
        fgets(buffer,bufsize,fp);
        strcat(str,buffer);
    }
    fclose(fp);
    return str;
}


int main(void)
{
    test_fgets("d:/test.txt");

    printf("=====================================\n");
    char *p;
    p=getAllFileData("d:/test.txt");
    if (p!=NULL)
    {
        puts(p);
        free(p);
    }
    return 0;
}