2012-03-19 52 views
-2

這裏我有一個文件包含一些信息,並且我想檢查一些標記值是否存在於文件中。如果存在,那麼我想檢索這些值。想要檢查值是否存在於文件中

這裏標籤的數量是固定的,標籤的長度不會超過16個,標籤的值的長度差不多固定不超過10個字節。

從下面的文件I想要查詢KERNEL標記值是存在或不存在,FS標籤值是存在或不存在,等等等等

我要檢查的所有值都存在與否之後:(結腸)。

我的文件包含這樣的文字。

KERNEL:2.31 
FS:3.4 
XLOADER:1.1 
UBOOT:2.2 

或類似這樣的

KERNEL:2.31 
FS: 
XLOADER:1.3 
UBOOT: 

我使用此代碼

#include <stdio.h> 

int main() { 

    FILE *infile = fopen("example.txt", "r"); 

    char buffer[256]; 
    char value[128]; 

    while (fgets(buffer, sizeof(buffer), infile)) 
     if (1 == sscanf(buffer, "KERNEL:%s", value)) { 
      printf("Value = %s\n", value); 
     } 
    return 0; 
} 

但在代碼中,我調用4這個函數4次不同的不同的值。像KERNEL,FS等

這樣

Value = 2.31 

i。從所述數據文件和比我想解析每個標籤的值讀出線這個代碼輸出(單元想要識別值是存在或不存在)。

所以這是做這個事情的好方法可以任何身體暗示我嗎?

+1

「在Stack Exchange,我們堅持要求提出問題的人在他們的問題上付出了一些努力,我們對此有些不屑。」 (http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html) – abelenky 2012-03-19 05:11:35

回答

1

你的問題沒有說清楚的文件是什麼情況下(或沒有當我開始接聽)。據推測,這是應用程序可以通過某種方式找到的文本文件。

您尚未指定內容(標籤)是否應該是固定的,文件是否可以包含其他信息,是否存在註釋約定,是否允許空行,如果標籤丟失會發生什麼總而言之,如果文件中存在意外標籤,會發生什麼情況,如果重複標籤(使用相同版本,使用不同版本)會發生什麼情況。標籤是否區分大小寫;在標籤之前是允許的空白;版本之前;版本後?版本號中允許使用哪些字符?這些都是重要的細節。

讓我們假設名稱列表是固定的。我們假設標籤不超過7個(終端空值爲8)。假設版本號總共不超過15個字符(16個允許終端空)。假設您需要記錄您找到的哪些標籤以及您找到的版本。

在這種情況下,你會最終有一個數據結構有點像這樣:

typedef struct VersionInfo 
{ 
    char  tag[8]; 
    char  version[16]; 
} VersionInfo; 

static VersionInfo version_data[] = 
{ 
    { "KERNEL", "" }, 
    { "FS",  "" }, 
    { "XLOADER", "" }, 
    { "UBOOT", "" }, 
}; 

顯然,由於可用的基本結構,你可以編寫一個函數來讀取數據文件中的每一行,丟棄任何評論或空行(如果適用的話)。你可以使用fgets()這個;預計的線路很短。你應該抱怨排長隊,並決定是否忽略它們或停止處理。您可以查找version_data陣列中的每個標籤,找到該標籤後,請注意是否先前找到該標籤,然後在該行上找到版本信息,並將其複製到version_data陣列的相應部分。

您可以使用「預期版本」字段以及實際版本字段來擴展結構。這可以讓你根據你找到的版本來決定做什麼。例如,根據編譯程序時已知的內容,您可能會有與允許版本相關的範圍。您可能允許使用3.0.3編譯的程序與3.0.4及更高版本一起運行,也許您甚至願意使用3.0.0及更高版本,但不是任何版本2.

注意版本比較本身就是一門藝術。例如,版本3.0.3,3.1.2,3.6,3.6.1,3.6.1.2和3.10.0可能應該被視爲按照版本號的升序排列。使用strcmp()不會達到(它會將3.10.0放在所有3.6版本之前)。


我看到您的示例代碼使用了固定字符串的sscanf()。這可能會將您與固定訂單聯繫起來,並且肯定不像數據結構允許的那樣靈活。如果使用sscanf(),我預期要使用的格式,例如:

if (sscanf(buffer, "%7s:%15s", tag, version) != 2) 
    ...something up with the input line... 
...process tag and version that you did find... 

您可以用字符類符號細化掃描:

if (sscanf(buffer, "%7[A-Z]:%15[0-9.]", tag, version) != 2) 

此只接受大寫字母的標籤,並且只接受版本信息中的數字和點(但對版本「..0 ... 0 ... 0」非常滿意,您可能不應接受該版本爲有效)。

+0

在這裏,但如何填充KERNEL值的數據結構。我的第一個目標是我想檢查值是否存在或空白。如果空白,我不得不做任何事情,如果現在離開它,繼續前進。我將在接收端解析這個文件。不需要在這裏解析。 – user1089679 2012-03-19 05:00:15

+0

從我想要檢索特定標記的值比我的上述代碼是文件的行? – user1089679 2012-03-19 05:01:34

+0

如果您不想保留您閱讀的信息,請勿將其複製到結構中。事實上,您可以將結構簡化爲預期的簡單標籤列表。您甚至可以按照您希望它們出現的順序放置它們。可能性是無止境。目前還不清楚爲什麼你想要閱讀文件,並檢查是否存在價值,如果你不記錄價值是否存在或不存在。由於這種檢查的動機目前是不可思議的(或者至少我沒有想到),所以很難給出一個很好的答案。 – 2012-03-19 05:04:38

0

鑑於你的樣品,我想嘗試第一種方法是:

Read a line 
Remove all whitespace 
    If the last character on the line is a colon <do something> 
Else 
    Do something else