15.2 文件输入

优质
小牛编辑
140浏览
2023-12-01

为了从文件获取数据,必须创建一个从文件到程序的流对象。这点我们可以利用ifstream的构造函数实现:

ifstream infile ("file-name");

该构造函数的参数是一个字符串,即你要打开的文件的名字。其结果是创建了infile对象,它支持所有 cin上可以执行的操作,包括>>和getline。

int x;
apstring line;
infile >> x; // 读取一个整型数并保存到x中
getline (infile, line); // 读取整行并保存到line中

如果我们提前知道文件中有多少数据,那就可以直接写一个循环来读取整个文件,然后再停止。然而更常见的情况是,我们想读取整个文件,但是不知道其大小。

ifstream有几个用以检查输入流状态的成员函数,它们是good、eof、fail和bad等。我们使用good函数来确保文件成功打开,而使用eof函数来探测”文件尾“。

无论什么时候从输入流读取数据,直到检查时你才能知道尝试是否成功。如果eof函数的返回值为true,那说明已经到达文件尾,我们就知道最后一次读取尝试以失败告终。下面程序代码的功能是:读取一个文件的每一行并将其输出到屏幕上。

apstring fileName = ...;
ifstream infile (fileName.c_str());

if (infile.good() == false) {
  cout << "Unable to open the file named " << fileName;
  exit (1);
}

while (true) {
  getline (infile, line);
  if (infile.eof()) break;
  cout << line << endl;
}

函数c_str把apstring转换为原生C字符串。因为ifstream构造函数期望的参数是C字符串,所以apstring必须转换一下。

我们可以在打开文件之后,立即调用good函数。如果系统无法打开文件,该函数就返回false,原因很可能是文件不存在或者你没有文件读取权限。

while(true)是无穷循环的习惯写法。通常循环中某处会有个break语句,这样程序就不会真的永远运行下去(不过有的程序的确是希望永远执行)。这个例子中,break语句允许只要发现文件尾就退出循环。

退出循环操作放在输入语句和输出语句之间很重要,这样getline在遇到文件尾失败之后,我们就不会在line中输出无效信息。