2011-09-17 47 views
4

我使用與fgets最初解析文件一行一行。現在我改變了一些東西,以便我已經將整個文件放入緩衝區。爲了解析目的,我仍然喜歡逐行閱讀該緩衝區。有什麼專門爲這一點,或者我需要做一個循環,在這個點的0x0A檢查char S'相當於緩衝區上的fgets?

+2

如果你使用的是C++,看看[istringstream](http://www.cplusplus.com/reference/iostream/istringstream/),它可以讓你'從內存中的字符串中讀取'。 –

+2

你已經標記了'c'和'C++'......這是什麼?你的緩衝區是如何定義的? –

+0

決定是否要編寫C代碼或C++代碼。然後回來問問怎麼做。我不會浪費時間爲您編寫C++解決方案,因爲您可能會將它解讀爲「不夠C」。 – sbi

回答

5

memchr(具有自己的包裝器代碼一點點,與memcpy結束)是完全等效 - 像fgets它需要一個最大長度它將處理(應該是剩餘的輸入緩衝器大小的最小和的大小的您的輸出緩衝區)並進行掃描,直至達到所需字符(將爲'\n')或耗盡輸入/輸出空間。

注意,對於已經在內存緩衝區的數據,不過,你可能想複製的步驟跳到一個單獨的輸出緩衝器,除非你需要用空字符結束的輸出,而無需修改輸入。許多新手C程序員經常犯這個錯誤,他們認爲他們需要空終止,只需改進一些接口就可以使用(指針,長度)對,從而允許您在不復制的情況下傳遞/處理子字符串他們。例如,你可以使用:printf("%.*s", (int)length, start);

+0

感謝您指出'memchr'。我從來沒有使用過,但之前使用過'strrchr',這非常方便。謝謝 –

0

有sscanf的可能會或可能不會爲你工作。

+0

似乎並不像sscanf爲我提供了一個指向匹配字符串結尾的指針,儘管如此。我仍然需要做一個搜索。 –

+0

它返回int處理的字節數。 – Joshua

+0

我很確定它會返回匹配的數量。 –

2

您可以使用sscanf功能這一點。如果你真的需要一整行,這樣的事情應該做的伎倆:

sscanf(your_buffer, "%50[^\n]", line); 

(這將讀取行最多50個字符長的像往常一樣,小心的長度和0終止並檢查返回值。 )

您可以使用指針算術來移動緩衝區(只需添加「返回」行長度+ 1)。

0

如果您要查找C函數,strtok()strsep()都將在指定字符上拆分字符串。

+0

我知道'strtok'會修改底層的字符串,這可能不適合這個任務,'strstep'是什麼? –

+1

是的,這兩個函數都修改了字符串。如果你不需要,你需要用'strchr' /'memcpy'來做點什麼。 – duskwuff