2014-03-31 87 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