如何知道现在正在读取的行数

时间:2014-01-13 13:34:55

标签: c string

上次我问过我的项目中的信号,你的帮助很有帮助。我只遇到一个问题。我想读取一个文件(必须是大文本文件)并计算一些单词的出现次数。这不再是问题了  但每当我调用SIGSTP(ctrl + Z)时,程序应该显示它现在正在读取的行号,这怎么可能。 我知道如何计算整个文本的行数,所以如果我在某个时间调用它,返回的数字将是整个行号或正在读取的行

2 个答案:

答案 0 :(得分:1)

您可以使用信号系统调用注册特定信号:

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

例如:

void signal_handler(int signal) 
{
    //display line number
}

signal(SIGSTP, signal_handler);

信号将中断当前代码链,这意味着在读取文件时可以调用信号处理程序。 如果使用全局变量来存储正在读取的行,则返回最新的调用值。

答案 1 :(得分:1)

维护一个全局整数计数器,它是正在读取的行的行号。每次读一行时增加(或者如果你没有按行阅读,每次点击\n时)。在信号处理程序中打印。

请注意,尽管上述方法有效,但从技术上讲,使用man -s7 signal或其他方式在信号处理程序中打印任何内容都是不安全的(请参阅printf以查看可以执行的安全操作列表)缓冲I / O,所以从技术上讲,你应该使用write或类似的,自己进行格式转换。