2015-06-03 44 views
1

我正在編寫一個C程序來解析一些輸入文件,這些輸入文件可以有兩種不同的版本。我需要能夠推斷文件格式,因爲我解析文件。如何測試標準輸入是否以某個詞開始?

第一個版本僅僅是一個數字的列表,每行一個:

123 
456 
789 

第二種類型文件的每行有兩個數字,在頂部的線路標記爲文件的最新版本格式

#version 2 
123 10 
456 20 
789 30 

什麼是測試它,我開始閱讀與"#version N"行的文件中簡單方法是什麼?如果版本行在那裏,我想要消耗它,如果沒有,那麼我不想消耗輸入流中的任何字符。

的問題是,我想我需要一些方法來讀字,我只知道ungetc函數的,只適用於單個字符而不是一整行。

回答

1

一旦你讀取這個文件,你可以設置你的指針回到原來的位置。

C提供fseek改變文件指針的位置。一旦讀取文件並發現文件版本不同,可以使用fseek將指針設置爲開始,以便下一次讀取從文件的開始處開始。

2

我不確定我是否理解你的問題。看起來你所需要的只是ungetc(),因爲你可以跳過空格,直到看到一個數字或一個#,然後你就會知道哪個文件是哪個文件。然而你覺得你需要更多,我不知道你爲什麼這樣想。

你可以寫一個分析的輸入令牌的「標記生成器」,然後進行處理代碼消耗的令牌。然後,只需再次查看第一個令牌指針,即可「倒帶」。

這是一個很好的分工:你可以讓你的標記器句柄跳過空白,跳過評論,甚至做一些事情,如處理#include指令。您可以讀取一行,使標記器將其拆分到空白處,並將指向該行中每個單詞的指針傳遞給代碼的其餘部分。

或者你可以使用malloc()分配緩衝區從輸入每個令牌,如果你希望程序儘可能靈活。我用這種方式編寫了簡單的編譯器,因爲我希望能夠在令牌級別「倒帶」來查看在其他事情之前發生的事情。輸入文件被轉換爲一個鏈接的標記列表,我可以在當前標記之前和之後查看,以嘗試從上下文中找出結果。

0

好吧,如果你知道每個文本文件都將有#version x(其中x爲數字),在該文件的頂部。你可以做一個簡單的fscanf確定的版本號,然後調用一個函數來處理這種類型的版本:

/* where 'str' is a char[] and 'version' is an int */ 
fscanf(pfile, "%s %d", str, &version) 

if (version == 1) { 
    /* Handle version 1 */ 
} 
if (version == 2) { 
    /* Handle version 2 */ 
} 
+0

的「版本1」文件沒有在頂部的線路。他們只是一個名單 – hugomg

相關問題