【发布时间】:2011-11-05 10:00:26
【问题描述】:
我正在 Unix 中实现我自己版本的 ("cat") 命令以进行练习。在我这样做之后,我开始对实现一些标志(如(-n)和(-b))感兴趣。
我的问题:我正在寻找一种在读取文件时定位空白行和新行的方法。我不记得我应该使用什么库或函数。
这是我正在处理的源代码:
#include <fcntl.h>
#include <unistd.h>
static int cat_fd(int fd)
{
char buf[4096];
ssize_t nread;
while ((nread = read(fd, buf, sizeof buf)) > 0)
{
ssize_t ntotalwritten = 0;
while (ntotalwritten < nread)
{
ssize_t nwritten = write(STDOUT_FILENO, buf + ntotalwritten, nread - ntotalwritten);
if (nwritten < 1)
{
return -1;
}
ntotalwritten += nwritten;
}
}
return (nread == 0) ? 0 : -1;
}
static int cat(const char *fname)
{
int fd, success;
if ((fd = open(fname, O_RDONLY)) == -1)
{
return -1;
}
success = cat_fd(fd);
if (close(fd) != 0)
{
return -1;
}
return success;
}
int main(int argc, char **argv)
{
int i;
if (argc == 1)
{
if (cat_fd(STDIN_FILENO) != 0)
goto error;
}
else
{
for (i = 1; i < argc; i++)
{
if (cat(argv[i]) != 0)
{
goto error;
}
}
}
return 0;
error:
write(STDOUT_FILENO, "error\n", 6);
return 1;
}
非常感谢有关我的问题的任何想法或建议。 如果您能帮我输入完整的函数原型,我将不胜感激,因为我不是经验丰富的程序员。
提前感谢您的帮助。
P.S:我正在实现 (-n) 和 (-b) 标志。因此,我期待在我正在阅读的文件的每一行的开头写下行号。
【问题讨论】:
-
cat-ing 时不需要定位空格和换行符。
-
我正在实现 (-n) 和 (-b) 标志。我需要在文件中的每个新行之后提示行号。
-
为什么是 C++ 标签?我只看到 C 代码。
-
这是因为 C++ 程序员知道如何阅读 C 代码。
-
使用 memchr 是在缓冲区中搜索特定字符的有效方法。