2013-04-16 47 views
-3

我有一個程序需要從文件讀取一行,每次它接收到SIGUSR2信號時。我做了一切,除了如何閱讀一行。如何讀取單行

文件的內容:

one 
two 
three 
four 
five 
... 
ten 
+0

[這]( http://crasseux.com/books/ctutorial/getline.html)可以幫助你 –

+3

假設你通過一個足夠大的緩衝區,[fgets](http://linux.die.net/man/3/fgets)將會只讀一行 – simonc

+0

如果您向我們展示迄今爲止的代碼,也許我們可以幫助改進它。你有什麼嘗試? – Jean

回答

4

使用fgets()功能....它會讀取直到換行來了...不然ü可以用龜etc由一個字符讀一個字符,當u得到/ N,則美國可以結束的閱讀

+2

這是不好的建議,因爲應該從信號處理程序調用有問題的函數。閱讀'man 7 signal'的人學習'fgets()'不是保存從信號處理程序調用。 – alk

+0

@alk你能引用來自'man 7 signal'的句子嗎?這對未來的讀者會有用。 – Jean

+0

@jean:請參閱我剛剛添加到我對OP的回答中的鏈接。 – alk

2

烏爾操作,您可以使用fscanf()

fscanf(fp, " %[^\n]",buffer); 

這允許讀取文件一行。

叫什麼你想從你的文件中讀取1線

注意每次:

  1. 您在使用時要小心

    。如果該行大於buffer大小,則會造成溢出。您必須確保您使用的緩衝區大小始終大於每個行的大小。

  2. 如果你的文件的行以空格(在isspace()定義)開始,然後論文作爲OP意味着數據應該從信號處理程序來讀取,唯一的空間將不會cpatured

+0

你確定它在C中工作嗎?正則表達式在'fscanf'中? – TrueY

+0

@TrueY它不是正則表達式。它是由scanf()定義的格式說明符 – MOHAMED

+0

'* scanf()'是讀取任意輸入的不好選擇。你自己提到了這個特殊用法的兩個問題。 '* scanf()'也會遇到非常差的錯誤處理。它用於任何東西,除了回讀你自己的代碼以前使用'* printf()'編寫的格式良好的東西通常是不鼓勵的。 – DevSolar

3

方法去使用read(),因爲這是最近版本的man 7 signal提到的唯一功能,可以從信號處理程序保存調用。有關詳細信息,請閱讀此處:http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html

通過read()讀取一行可以逐字節讀取,直到找到EOL字符。

在讀取之前,不清楚需要讀取多少數據才能找到EOL,或者需要定義最大值,然後才能用來聲明要讀取的緩衝區,或者需要緩衝區大小在環繞read()時動態增加。

更新:

摘錄形式man 7 signal(方括號中由我評論):

異步信號安全功能

的信號處理函數必須非常小心,因爲處理其他地方的程序可能會在執行程序的某個任意點中斷。 POSIX具有「安全功能」的概念。如果信號中斷執行不安全的函數,並且處理程序調用不安全的函數,那麼程序的行爲是不確定的。

POSIX.1-2004(也被稱爲POSIX。1-2001技術勘誤2)要求執行,以保證下面的功能可以被安全地調用一個訊號處理器中:

[名單切出,見上面鏈接列表]