istream 讀文件的幾種方式,函數用法

1:getline方式
2:seekg->read 方式
3:循環read方式
//循環read方式時如果在還未讀入 MAX_FILE_LEN 個字符時就到了文件尾,可以用成員函數 int gcount();來取得實際讀取的字符數;

    const int MAX_FILE_LEN = 1024;
    char rootdir[MAX_FILE_LEN] ={0};
    ::GetCurrentDirectoryA(MAX_PATH,rootdir);
    strcat(rootdir,("\\文字.txt"));

    string mail_body = "";
    string mail_bodyT = "";
    string mail_bodyF = "";
    ifstream ifs(rootdir, ios::in | ios::binary);
    if ( ifs.is_open() )
    {   
        //getline方式
        string strLine = "";
        while(std::getline(ifs,strLine))
        {
            mail_body += strLine;
        }


        //seekg->read 方式
        ifs.seekg(0, ios::end); 
        int length = ifs.tellg();
        ifs.seekg(0, ios::beg);
        char * buffer = new char [length];
        ifs.read (buffer,length);
        mail_bodyT = buffer;

        //循環read方式
        int iLen = 0;
        char fileBuff[MAX_FILE_LEN];
        memset(fileBuff, 0, MAX_FILE_LEN*sizeof(char));
        while (ifs.read(fileBuff, MAX_FILE_LEN))  //判斷的讀取後ifs.good()
        {
            mail_bodyF += fileBuff;
            iLen += ifs.gcount();
            memset(fileBuff, 0, MAX_FILE_LEN*sizeof(char));
        }
        mail_bodyF += fileBuff; //剩餘的ifs.gcount()個字符
        iLen += ifs.gcount();   //這裏的iLen應該跟前面的length是等值的

        ifs.close();
    }

補充:seekg() 和tellg()的函數用法

    seekg()函數
    istream& seekg(streampos pos);
    istream& seekg(streamoff off, ios_base::seekdir way);
    /*
    用法1設置輸入流指針相對於開始的絕對位置 
      其實就相當於 seekg(streampos pos, ios::beg);
      pos是一個非負整數。
    用法2設置輸入流指針相對於基地址的位置, 基地址可以是[ios::beg,ios::end,ios::cur]
      參數off是偏移值,參數way是基地址的類型。 
      其中offs是有符號整型
    */

    tellg()函數
    streampos tellg(); 
    //返回當前定位指針的位置。上面的示例中它先定位到了ios::end文件結束處,所以返回也就是文件的大小。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章