如何在程序打开的文件上发出EOF信号

时间:2016-09-30 20:12:50

标签: c++ compiler-construction eof lexical-analysis

在C ++中读取文件时,如何发出EOF信号?我正在编写一个直接编码扫描程序,作为编译器设计的一部分,它读入一个文件并将其拆分为一种语言的标记。

我将阅读整个程序,删除注释,并压缩空白。然后将生成的程序char by char放入最大1024个字符的缓冲区中。因此,当我们清空时,我们将重新填充缓冲区或不填充缓冲区。

要打开我写的文件:

// Open source file.
source_file.open (filename);
if (source_file.fail()) {
   // Failed to open source file.
   cerr << "Can't open source file " << *filename << endl;
   buffer_fatal_error();

要填充缓冲区,我想使用while循环并像

一样迭代
int i = 0;
// Iterate through the whole file
while(source_file.at(i) != EOF)
{
   // If not a tab or newline add to buffer
   if (source_file.at(i) != "\n" || source_file.at(i) != "\t")
   {
      bufferList.add(source_file.at(i));
   }
   i++;
}

对于我正在打开的文件,是否有办法向EOF发出信号?

这或多或少是一个大致的概要。我需要弄清楚如何在空的时候重新填充缓冲区或使用双缓冲。我还需要弄清楚如何删除以#开头的评论。例如# This is a comment。我的扫描程序会看到#并删除所有内容,直到它获得下一个换行符。

1 个答案:

答案 0 :(得分:0)

试试这个:

char c;
std::vector<char> buffer(1024);
while (source_file.get(c))
{
  if ((c != '\n') || (c != '\t'))
  {
     buffer.push_back(c);
  }
}

读取数据的标准方法是在while循环中测试读取操作的结果。

对于块读取,您可以执行以下操作:

char buffer[1024];
while (source_file.read(buffer, sizeof(buffer))
{
  // Process the buffer here
}

您还应该使用std::istream::gcount()来获取从文件中读取的字符数,因为它可能小于缓冲区大小。