在文件C ++中查找字符串

时间:2014-03-31 22:16:51

标签: c++ c parsing

我正在尝试用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.
}

3 个答案:

答案 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 strncmpstrcmp(或C ++&#39; std::stringstreamstd::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 ++解决方案,但是:

  1. fgets读取一行(哦,好吧,如果你愿意,你可以用C ++函数替换它);
  2. 如果以“评论”指示符开头,请跳至循环结束
  3. 如果该行为空(即,它只包含一个硬回车;或者,可能检查零个或多个空格字符,然后然后一个行尾),跳到结束环
  4. 在循环结束时:如果你有别的东西,请在该字符串上使用sscanf