相关文章推荐
一身肌肉的乌龙茶  ·  Nvidia Jetson ...·  1 月前    · 
稳重的猴子  ·  BrightnessOverride 类 ...·  2 月前    · 
聪明的领结  ·  Workflow | ...·  1 年前    · 

输入流成员函数用于磁盘输入。

如果使用输入文件流 ( ifstream ),则必须将该流与特定磁盘文件关联。 可在构造函数中实现此操作,或者可使用 open 函数。 在这两种情况下,参数都相同。

打开与输入流关联的文件时,通常要指定一个 ios_base::openmode 标志(默认模式为 ios::in )。 有关 openmode 标志的列表,请参阅 ios_base::openmode 。 这些标志可与按位“或”( | ) 运算符组合。

若要读取文件,请首先使用 fail 成员函数来确定文件是否存在:

istream ifile("FILENAME");
if (ifile.fail())
// The file does not exist ...

未格式化的 get 成员函数作用方式与 >> 运算符类似,但有两个例外。 第一,get 函数会将空格字符包含在内,而在设置了 skipws 标志(默认设置)时提取器会将空格排除在外。 第二,get 函数导致绑定输出流(例如 cout)刷新的可能性较小。

get 函数的变体可指定缓冲区地址和要读取的最大字符数。 这在限制发送给特定变量的字符数时非常有用,如本例所示:

// ioo_get_function.cpp
// compile with: /EHsc
// Type up to 24 characters and a terminating character.
// Any remaining characters can be extracted later.
#include <iostream>
using namespace std;
int main()
   char line[25];
   cout << " Type a line terminated by carriage return\n>";
   cin.get( line, 25 );
   cout << line << endl;

getline

getline 成员函数类似于 get 函数。 这两个函数均允许用于指定输入终止字符的第三个参数。 默认值为换行字符。 这两个函数均会保留一个字符作为所需终止字符。 但是,get 会将终止字符留在流中,而 getline 会删除此终止字符。

如下示例为输入流指定了一个终止字符:

// getline_func.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
   char line[100];
   cout << " Type a line terminated by 't'" << endl;
   cin.getline( line, 100, 't' );
   cout << line;

read 成员函数会将文件中的字节读取到内存的指定区域。 长度参数决定了所读取字节的数量。 如果未包含该参数,则到达文件物理末尾时,或在文本模式文件的情况下读取到嵌入的 EOF 字符时,将停止读取。

本示例将工资单文件中的二进制记录读取到一个结构中:

#include <fstream>
#include <iostream>
using namespace std;
int main()
   struct
      double salary;
      char name[23];
   } employee;
   ifstream is( "payroll" );
   if( is ) {  // ios::operator void*()
      is.read( (char *) &employee, sizeof( employee ) );
      cout << employee.name << ' ' << employee.salary << endl;
   else {
      cout << "ERROR: Cannot open file 'payroll'." << endl;

程序会假定这些数据记录完全以此结构指定的方式进行格式化,其中不包含任何终止回车或换行字符。

seekgtellg

输入文件流会使内部指针保持处于文件中接下来要读取数据的位置。 使用 seekg 函数设置此指针,如此处所示:

#include <iostream>
#include <fstream>
using namespace std;
int main( )
   char ch;
   ifstream tfile( "payroll" );
   if( tfile ) {
      tfile.seekg( 8 );        // Seek 8 bytes in (past salary)
      while ( tfile.good() ) { // EOF or failure stops the reading
         tfile.get( ch );
         if( !ch ) break;      // quit on null
         cout << ch;
   else {
      cout << "ERROR: Cannot open file 'payroll'." << endl;

若要使用 seekg 来实现面向记录的数据管理系统,请用固定长度记录大小乘以记录数来获取相对于该文件末尾的字节位置,然后使用 get 对象读取记录。

tellg 成员函数会返回读取的当前文件位置。 该值为 streampos 类型,即 <iostream> 中定义的一个 typedef。 如下示例会读取文件并显示指示空格位置的消息。

#include <fstream>
#include <iostream>
using namespace std;
int main( )
   char ch;
   ifstream tfile( "payroll" );
   if( tfile ) {
       while ( tfile.good( ) ) {
          streampos here = tfile.tellg();
          tfile.get( ch );
          if ( ch == ' ' )
             cout << "\nPosition " << here << " is a space";
   else {
      cout << "ERROR: Cannot open file 'payroll'." << endl;

close

close 成员函数会关闭与输入文件流关联的磁盘文件,并释放操作系统文件句柄。 ifstream 析构函数将关闭该文件,但如需打开同一流对象的另一个文件,则可以使用 close 函数。