在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
。我的扫描程序会看到#
并删除所有内容,直到它获得下一个换行符。
答案 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()
来获取从文件中读取的字符数,因为它可能小于缓冲区大小。