C 如何测试标准输入是否以某个单词开头?

C 如何测试标准输入是否以某个单词开头?,c,C,我正在编写一个C程序来解析一些输入文件,这些文件可以有两个不同的版本。在解析文件时,我需要能够推断文件格式 第一个版本只是一个数字列表,每行一个: 123 456 789 第二种类型的文件每行有两个数字,顶部有一行将其标记为文件格式的最新版本 #version 2 123 10 456 20 789 30 最简单的测试方法是什么?我正在读取的文件以“#version N”行开头?如果版本行在那里,我想使用它,如果不是,那么我不想使用输入流中的任何字符 问题是我想我需要一些方法来读取未读字符,

我正在编写一个C程序来解析一些输入文件,这些文件可以有两个不同的版本。在解析文件时,我需要能够推断文件格式

第一个版本只是一个数字列表,每行一个:

123
456
789
第二种类型的文件每行有两个数字,顶部有一行将其标记为文件格式的最新版本

#version 2
123 10
456 20
789 30
最简单的测试方法是什么?我正在读取的文件以
“#version N”
行开头?如果版本行在那里,我想使用它,如果不是,那么我不想使用输入流中的任何字符


问题是我想我需要一些方法来读取未读字符,我只知道ungect,它只对单个字符有效,而不适用于整行。

一旦读取文件,您可以将指针设置回原始位置


C提供
fseek
来更改文件指针的位置。一旦您阅读了文件并发现它的版本不同,您可以使用
fseek
将指针设置在开头,以便下次读取从文件开头开始。

我不确定是否理解您的问题。似乎您只需要
ungect()
,因为您可以跳过空白,直到看到一个数字或
#
为止,然后您就会知道哪个文件是哪个文件。但是你觉得你需要更多,我不知道你为什么会有这种感觉

您可以编写一个“标记器”,将输入解析为标记,然后让处理代码使用这些标记。然后,您只需再次查看第一个令牌指针即可“倒带”

这是一个很好的分工:您可以让您的标记器处理跳过空白、跳过注释,甚至执行诸如handle
#include
指令之类的操作。您可以读取一行代码,让标记器在空白处将其拆分,并向该行中的每个单词传递指针,以供其余代码使用


或者,如果希望程序尽可能灵活,可以使用
malloc()
为输入中的每个令牌分配一个缓冲区。我以这种方式编写了简单的编译器,因为我希望能够在令牌级别“倒带”,以查看在其他东西之前发生了什么。输入文件被转换为令牌的链接列表,我可以查看当前令牌的前后,尝试从上下文中找出问题。

如果您知道每个文本文件的顶部都将有
#version x
(其中x是数字)。您可以执行一个简单的fscanf来确定版本号,然后调用一个函数来处理该类型的版本:

/* where 'str' is a char[] and 'version' is an int */
fscanf(pfile, "%s %d", str, &version)

if (version == 1) {
    /* Handle version 1 */
}
if (version == 2) {
    /* Handle version 2 */
}
“版本1”文件顶部没有一行。它们只是一个NMBER列表