gpt4 book ai didi

c - 如何从 C 中的只读 FIFO 读取一行?

转载 作者:行者123 更新时间:2023-11-30 17:44:42 25 4
gpt4 key购买 nike

我在从只读 FIFO 读取几行时遇到问题。特别是,我必须读取两行 - 数字 n,后跟 \n 和字符串 str - 我的 C 程序应该在只写 FIFO 中写入 strn 次。这是我的尝试。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

char *readline(int fd);

int main(int argc, char** argv) {
int in = open(argv[1], O_RDONLY);
mkfifo(argv[2], 0666);
int out = open(argv[2] ,O_WRONLY);
char *line = (char *) malloc(50);
int n;

while (1) {
sscanf(readline(in), "%d", &n);
strcpy(line, readline(in));

int i;
for (i = 0; i < n; i++) {
write(out, line, strlen(line));
write(out, "\n", 1);
}
}

close(in);
close(out);
return 0;
}

char *readline(int fd) {
char *c = (char *) malloc(1);
char line[50];

while (read(fd, c, 1) != 0) {
if (strcmp(c, "\n") == 0) {
break;
}
strcat(line, c);
}
return line;
}

代码工作正常,但它在最后一个字符串重复之后放置了随机数量的换行符。此外,这个数字在每次执行时都会发生变化。

有人可以给我任何帮助吗?

最佳答案

除了按字符读取和使用“字符串”比较来比较两个字符都远非高效的事实之外,readline()返回一个指向被声明为 readline() 局部内存的指针,即line[50]一旦readline(),内存就会被释放。返回,因此随后访问它会调用未定义行为。

解决此问题的一种可能性是声明缓冲区以将行读入外部 readline()并像这样传递对它的引用:

char * readline(int fd, char * line, size_t size) 
{
if ((NULL != line) && (0 < size))
{
char c = 0;
size_t i = 0;
while (read(fd, &c, 1) >0)
{
if ('\n' == c) or (size < i) {
break;
}
line[i] = c;
++i;
}
line [i] = 0;
}

return line;
}

然后这样调用它:

char * readline(int fd, char * line, size_t size);

int main(void)
{
...
char line[50] = "";
...
... readline(in, line, sizeof(line) - 1) ...

关于c - 如何从 C 中的只读 FIFO 读取一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19879656/

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