gpt4 book ai didi

c - 在 C 中逐行读取管道

转载 作者:太空狗 更新时间:2023-10-29 17:00:00 26 4
gpt4 key购买 nike

如何分离来自管道的管线。在管道中有这段文字:

HALLO:500\n
TEST:300\N
ADAD
ADAWFFA
AFAGAGAEG

我想将管道与管道分开,因为我想将值保存在变量中。

这是我的 C 代码:

#include <stdio.h>
#include <stdlib.h>

#define BUFFERSIZE 1

int main(int argc, char **argv){
unsigned char buffer[BUFFERSIZE];
FILE *instream;
int bytes_read=0;
int buffer_size=0;


buffer_size=sizeof(unsigned char)*BUFFERSIZE;
/* open stdin for reading */
instream=fopen("/dev/stdin","r");

/* did it open? */
if(instream!=NULL){
/* read from stdin until it's end */
while((bytes_read=fread(&buffer, buffer_size, 1, instream))==buffer_size){
fprintf(stdout, "%c", buffer[0]);
}
}
/* if any error occured, exit with an error message */
else{
fprintf(stderr, "ERROR opening stdin. aborting.\n");
exit(1);
}

return(0);
}

这是从管道中逐行读取最佳方法的正确方法吗?

最佳答案

这通常称为从标准输入读取。程序不应该关心输入是管道、重定向文件还是键盘。

fread 将一直读取直到缓冲区已满。使用 fgets 读取一行。

缓冲区大小也应该足够大以容纳线路。对于一次性的小程序,您可以只选择一个数字。或者有一个标准名称 BUFSIZ,它为您提供了一个相当大 的缓冲区。多大?足够大。真的吗?可能吧。

fgets 将复制字符串中的换行符,除非字符串先填满。所以你可以测试最后一个字符来判断该行是否被截断了。有了合理的投入,这就不会发生。但更稳健的方法是分配更大的缓冲区,复制部分行,然后再次调用 fgets tp 继续尝试获取完整行。

#include <stdio.h>

int main() {
char buf[BUFSIZ];
fgets(buf, sizeof buf, stdin);
if (buf[strlen(buf)-1] == '\n') {
// read full line
} else {
// line was truncated
}
return 0;
}

这可以让您避免可怕的缓冲区溢出问题。 fgets 不会写入超过传递给它的大小。如上所述,另一半正在对可能由意外的长输入行导致的可能的部分行做一些明智的事情。

关于c - 在 C 中逐行读取管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16163154/

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