gpt4 book ai didi

c - 如何在 C/C++ 中读取文件时搜索换行符

转载 作者:行者123 更新时间:2023-11-30 14:27:18 29 4
gpt4 key购买 nike

我正在 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;
}

任何有关我的问题的想法或建议都将不胜感激。如果您能为我输入我将使用的完整函数原型(prototype),我将更加感激,因为我不是经验丰富的程序员。

预先感谢您的帮助。

P.S:我正在实现 (-n) 和 (-b) 标志。因此,我期待在我正在读取的文件的每一行的开头写入行号。

最佳答案

虽然 C 中有一个函数可以进行基于行的文件输入(称为 fgets),但您不能真正将它用于 cat,因为:

  • 无法事先知道线路的最大长度;
  • 如果输入包含空字节,您将丢失部分输入。

读取缓冲区后,您必须在缓冲区中查找换行符,一旦找到,就打印缓冲区的前缀,后跟换行符、行号和缓冲区的其余部分(需要进行额外的处理)当然是剩余的换行符)。

一个更简单的解决方案是切换到一次处理一个字节的输入;您可以使用 FILE* 和 fgetc 来使用 CRT 提供的缓冲,这样您实际上就不必为每个读/写执行系统调用,或者像现在一样按 block 读取文件,并在循环内执行字节处理。然后就是编写一个状态机的问题 - 如果先前读取的字符是换行符,则输出行号,除非该字符是换行符并且使用了 -b 选项等。

这仍然会导致效率较低的解决方案,因此您可能需要特别对待不带参数的 cat - 即仅在需要时才切换到逐字节处理。事实上,这正是至少一个实际的 cat 实现所做的事情。

关于c - 如何在 C/C++ 中读取文件时搜索换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8019423/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com