istream 读文件的几种方式,函数用法

时间:2021-09-29 20:05:25

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文件结束处,所以返回也就是文件的大小。