簡體   English   中英

使用fget在C中找到特定標簽后讀取文件的部分

[英]Reading parts of a file after a specific tag is found in C using fgets

我想對如何讀取類似“ XML”的文件提出一些建議,使程序僅讀取/存儲在滿足某些要求的節點中觀察到的元素。 我正在考慮通過以下方式使用兩個fget:

while (fgets(file_buffer,line_buffer,fp) != NULL)
 {
   if (p_str = (char*) strstr(file_buffer,"<element of interest opening")) )
    {
      //new fgets that starts at fp and runs only until the end of the node
       {
         //read and process
       }
    }
 }

這有意義嗎,或者有更聰明的方法嗎?

其次(按照我的想法),我是否需要定義一個新的FILE *(如fr),在第二個fget的開頭將fr設置為fp,或者我是否可以為此濫用原始文件指針?

使用XML解析器,例如Xmllib2 http://xmlsoft.org/xml.html

您的方法似乎對這項工作並不壞。

您可以從文件中讀取整行,然后使用sprintf,strstr或任何您喜歡的函數對其進行處理。 這將節省您的時間和FILE I / O的不必要的開銷。

根據您的第二個想法,您可以使用同一文件指針fp使用fseek() (參見: man fseek )或rewind() (參見: man rewind )。 您不需要額外的文件指針。

編輯:

如果您可以更改標簽格式以遵循XML結構,則可以正確使用libXML2和此類庫。

如果那不可能,那么您必須編寫自己的解析器。 一些提示:

  1. 首先將文件中的數據提取到緩沖區中,緩沖區的大小以及動態分配還是靜態分配都取決於您的規格。

  2. 如果非空白字符是<或標記通常以其開頭的任何字符,請在緩沖區中搜索。 如果沒有,您可以顯示錯誤並退出。

  3. 現在跟隨標記名稱,直到第一個空格或/或>字符。 存放它們。 根據需要處理=,字符串和內容。

  4. 如果下一個非空白字符為/,請檢查其后是否帶有>(或您的規格中的類似模式以查找標記是否結束)。 如果是這樣,則說明您已完成解析並可以返回結果。 否則,您的標簽格式錯誤,應該退出並出現錯誤。

    如果字符是>,則您已找到begin標記的末尾。 現在遵循的內容。 否則,接下來是一個論點。 解析該結果,存儲結果,繼續執行步驟4。

  5. 閱讀內容,直到找到一個<字符。

  6. 如果該字符后跟/,則為結束標記。 確認其后跟標簽名稱和>。 如果是,則返回結果,否則拋出錯誤。

  7. 如果到達這里,您將發現嵌套XML的開始。 使用此算法對此進行解析,然后再次從4開始。

盡管這是一個非常基本的想法,但我希望它可以幫助您入門。

編輯:如果您仍要引用該文件作為指針,請考慮使用mmap()

如果在mmap添加一點shared memory IPC和足夠的內存鎖定內容,則可以編寫並行處理程序,該程序將更快地處理大多數文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM