簡體   English   中英

如果你不知道要讀取的字符數,如何使用fgets?

[英]How to use fgets if you don't know the number of characters to be read?

我需要讀取一個文件並將其中的文本發送到一個字符串,以便我可以解析它。 但是,程序不會確切地知道文件的長度,所以如果我想使用fgets() ,或者有更好的選擇,我該怎么辦?

注意:

char *fgets(char *str, size_t num, FILE *stream);

不要忘記fgets()讀取一行,但要有足夠的空間。

人類很少寫行超過... 80,256,選擇一個數字......字符。 POSIX建議行長度為4096.所以,我通常使用:

char buffer[4096];

while (fgets(buffer, sizeof(buffer), fp)) 
{
    ...process line...
}

如果您擔心某人可能在一行中提供超過4K的數據(並且機器生成的文件,例如HTML或JSON,可能包含該數據),那么您必須決定下一步該做什么。 您可以執行以下任何操作(並且可能還有其他一些我未提及的選項):

  1. 以位為單位處理過長的行而不假設其間存在換行符。
  2. 為更長的行分配內存(比如8K開始),將初始4K復制到分配的緩沖區,並將更多數據讀入緩沖區的后半部分,迭代直到找到行尾。
  3. 使用Linux上提供的POSIX 2008函數getline() 它為你做內存分配。

你可以迭代地使用fgets,但更簡單的替代方法是(stdio.h) getline 它在POSIX中,但它不是標准C.

既然你正在使用C ++,你可以使用像iostream的getline這樣的std :: string函數嗎?

如果您不在POSIX系統上並且沒有getline可用,請查看Chuck Falconer的公共域ggets / fggets函數 ,這些函數動態增加緩沖區以消耗整行。 (這個鏈接現在似乎已經關閉,但archive.org有一份副本 。)

分配緩沖區( str指向的緩沖區),並將緩沖區的大小傳遞給num 占用的實際空間僅為fgets讀取的文本的長度。

就像是:

char str[1000];
fgets(str, 1000, &file);

如果下一行在換行符之前只有10個字符,則str將保存這10個字符,換行符和空終止符。

編輯 :以防萬一有任何混淆,我不打算上面的聲音,好像緩沖區中的額外空間沒有被使用。 我只是想說明你不需要提前知道你的字符串將持續多長時間,只要你可以在它上面放一個最大長度。

暫無
暫無

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

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