![](/img/trans.png)
[英]Reading a specific number of lines from a file in C (scanf, fseek,fgets)
[英]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和此類庫。
如果那不可能,那么您必須編寫自己的解析器。 一些提示:
首先將文件中的數據提取到緩沖區中,緩沖區的大小以及動態分配還是靜態分配都取決於您的規格。
如果非空白字符是<
或標記通常以其開頭的任何字符,請在緩沖區中搜索。 如果沒有,您可以顯示錯誤並退出。
現在跟隨標記名稱,直到第一個空格或/或>字符。 存放它們。 根據需要處理=,字符串和內容。
如果下一個非空白字符為/,請檢查其后是否帶有>(或您的規格中的類似模式以查找標記是否結束)。 如果是這樣,則說明您已完成解析並可以返回結果。 否則,您的標簽格式錯誤,應該退出並出現錯誤。
如果字符是>,則您已找到begin標記的末尾。 現在遵循的內容。 否則,接下來是一個論點。 解析該結果,存儲結果,繼續執行步驟4。
閱讀內容,直到找到一個<字符。
如果該字符后跟/,則為結束標記。 確認其后跟標簽名稱和>。 如果是,則返回結果,否則拋出錯誤。
如果到達這里,您將發現嵌套XML的開始。 使用此算法對此進行解析,然后再次從4開始。
盡管這是一個非常基本的想法,但我希望它可以幫助您入門。
編輯:如果您仍要引用該文件作為指針,請考慮使用mmap()
。
如果在mmap
添加一點shared memory
IPC和足夠的內存鎖定內容,則可以編寫並行處理程序,該程序將更快地處理大多數文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.