2014-03-31 70 views
-1

我想解析C++中的文件。我的文件内容如下:查找文件中的字符串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

'fscanf'是一个C函数。如果你想要一个C的解决方案,为什么你把它标记为C++? – 0x499602D2

+2

@ 0x499602D2它也是有效的C++。但是流通常对I/O – clcto

+0

有帮助,我也包含了C标签。 – user2495173

回答

0

我喜欢通过读取线的时间,并且然后使用sscanfstrncmpstrcmp(或C++的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; 
     ... 
    } 
} 

还有其他的方法来做到这一点当然苦苦的。

0

因为这是C++的标签,我会给你一个C++解决方案。

您可以使用一个调用f.ignore()丢弃流的第一线:

f.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

从技术上讲这跳过了一切,并包括在第一行的末尾换行符,所以流位置将在第二行行的换行符之前。格式化的I/O会丢弃引导空白,所以这不成问题。

以上要求使用C++文件流,因为这是C++,并且使用格式化的运算符operator>>()operator<<()来执行输入和输出。

0

不是特定的C++的解决方案,但是:

  1. 读取符合fgets(哦,好吧,如果你愿意,你可以替代一个C++函数);
  2. 如果它与您的“注释”标志开始,跳到最后循环
  3. ,如果该行是空的(即,它仅包含一个硬回车;或者,可能的话,检查零个或多个空白字符和然后 end-of-line),跳到循环结尾
  4. 循环结束:如果还有其他内容,请在该字符串上使用sscanf