如何阅读单行

时间:2013-04-16 10:28:51

标签: c unix file-io

我有一个程序,每次收到信号SIGUSR2时都需要从文件中读取一行。除了如何读取一行之外,我做了一切。

文件内容:

one
two
three
four
five
...
ten

3 个答案:

答案 0 :(得分:4)

使用fgets()函数....它将读取直到换行...或者你可以通过使用fgetc读取一个char,当你得到/ n然后你可以结束你的阅读操作< / p>

答案 1 :(得分:3)

由于OP意味着应该从信号处理程序读取数据,因此唯一的方法是使用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)要求实现以保证在信号处理程序中可以安全地调用以下函数:

     

[列出剪切,请参阅上面的链接列表]

答案 2 :(得分:2)

您可以使用fscanf()

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

这允许从您的文件中读取一行。

每次要从文件中读取1行时调用它

注意:

  1. 使用它时必须小心。如果该行大于buffer大小,则会导致溢出。你必须确保你使用的缓冲区大小总是大于每行的大小。

  2. 如果文件中的行以空格开头(在isspace()中定义),那么这些空格将不会被