使用流插入运算符读取文件

Using the stream insertion operator to read files

本文关键字:读取 文件 运算符 插入      更新时间:2023-10-16

我碰巧遇到了一个从文件中读取文本的代码示例,如下所示:

int i; 
char *fileName = "text.txt"; 
ifstream fin(fileName); 
while (fin >> i)
{
do something;
}

这段代码实际上打开并读取空格分隔的文本,但我不明白它是如何工作的。如何在没有"打开"或"读取"命令的情况下打开文件?有没有办法倒回文件的开头?我正在尝试创建一个动态分配的数组,直到我计算了文件的分数数之后,我才知道如何做。

如何在没有"打开"

或"读取"命令的情况下打开文件?

ifstream构造函数将打开该文件。

有没有办法倒回文件的开头?

使用 seekg() .如果已到达EOF,则需要在呼叫seekg()之前呼叫clear()

我正在尝试创建一个动态分配的数组

如果允许,您可以使用std::vector来存储读取的文本,从而避免两次读取文件的内容。

该文件由std::ifstream类的构造函数打开。

您可以使用fin.seekg(std::ios::beg);来倒带文件,但最好使用例如std::vectorstd::list,您可以在其中使用 push_back() 推送新元素,而无需事先知道元素的数量。

但是,由于家庭作业显然明确要求您使用手动分配的数组和指针,因此这样的事情就可以完成了这项工作:

#include <fstream>
#include <iostream>
#include <iterator>
int main()
{
  std::ifstream fin("text.txt");
  size_t n = 0;
  int i;
  for (; fin >> i; ++n);
  fin.clear();
  fin.seekg(0, std::ios::beg);
  int *scores = new int[n];
  std::istream_iterator<int> first(fin), last;
  std::copy(first, last, scores);
  std::copy(scores, scores+n, std::ostream_iterator<int>(std::cout, " "));
  std::cout << "n";
  delete[] scores;
}