我正在尝试用C ++解析文件。我的文件内容如下:
//Comments should be ignored
FileVersion,1;
Count,5;
C:\Test\Files\Test_1.txt 0,16777216,16777552,0,0,1,0,1,1,1;
FileVersion是我需要读取信息的第一行。之前的所有行都只是以' //'开头的注释。如何将光标设置为包含FileVersion的行?因为我正在使用fscanf从文件中读取信息。
if ( 1 != fscanf( f, "FileVersion,%d;\n", &lFileVersion ))
{
//Successfully read the file version.
}
答案 0 :(得分:0)
由于这是标记的C ++,我将为您提供C ++解决方案。
您可以使用f.ignore()
的一次调用来丢弃流的第一行:
f.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
从技术上讲,这会跳过所有内容,包括第一行末尾的换行符,因此流位置将位于 second 行的换行符之前。格式化的I / O会丢弃前导空格,因此这不会有问题。
以上要求使用C ++文件流,因为这是C ++,并使用格式化的运算符operator>>()
和operator<<()
来执行输入和输出。
答案 1 :(得分:0)
我喜欢通过一次读一行来编写解析器(假设&#34;基于行&#34;),然后使用sscanf
strncmp
和strcmp
(或C ++&#39; std::stringstream
和std::string::substr
)来检查各种内容。
在您的示例中,例如:
enum Sates
{
Version = 1,
Count = 2,
...
} state = Version;
char buffer[MAXLEN];
while(fgets(buffer, MAXLEN, f) != NULL)
{
if (0 == strncmp("//", buffer, 2))
{
// Comment. Skip this line.
continue;
}
switch (state)
{
case Version:
if (0 == strncmp("FileVersion,", buffer, 12))
{
if (1 == sscanf(buffer, "FileVersion,%d;", &version))
{
state = Count;
break;
}
Error("Expected file version number...");
}
break;
...
}
}
当然还有其他方法可以做到这一点。
答案 2 :(得分:0)
不是特定的C ++解决方案,但是:
fgets
读取一行(哦,好吧,如果你愿意,你可以用C ++函数替换它); sscanf
。