gpt4 book ai didi

C 倒回来自命令输出的 FILE 指针

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:56 25 4
gpt4 key购买 nike

我的命令输出有问题,当我尝试使用 rewind 或 fseek 再次启动并检查输出命令以执行其他操作时它不起作用,这是部分代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
FILE *pf;
int nhd=1;
size_t b_size = 80;
char *data = malloc(b_size * sizeof(char));
pf = popen("/sbin/mycmd -s","r");

while(-1 != getline(&data, &b_size, pf))
nhd++;

fseek (pf , 0 , SEEK_SET); // rewind(pf);

while(-1 != getline(&data, &b_size, pf))
nhd++;
printf("%i\n",nhd);
pclose(pf);
free(data);
}

它应该输出双倍的命令行数,但是倒带或者当我使用真实文件时什么都不起作用。我该怎么办?

最佳答案

如果您真的特别想将输出加倍,并且 fd 不是文件,请忽略 fseek() 并关闭管道并重新打开它并进行第二次读取循环。 nhd 也应该从 0 而不是 1 开始,以获得准确的读取行数。如果您的目标涉及更多,那么您应该指出您的目标。我对 fseek() 对非文件不起作用并不感到惊讶。文档指的是文件,但也模棱两可地表示“流”

更新:评论表明在输入时进行两次传递的原因是为了预先计算以确定要分配的数量。或者,使用链表通过 malloc() 动态分配数据,避免需要预先计数/预先分配:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 256

typedef struct list {
struct list *next;
char *string;
} LIST;

LIST *head, *p;

int
main(int argc, argv)
{
FILE *fp;
char line[MAX_LINE];

if ((fp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Error opening %s\n", argv[1]);
exit(-1);
}
while(fgets(line, sizeof(line), fp)) {
LIST *n = malloc(sizeof(LIST));
n->string = strdup(line);
n->next = NULL;
p = (head == NULL) ? head = n : p->next = n;
}
fclose(fp);

for(p = head; p; p != NULL; p->next)
printf("%s", p->string);

//
// . . . do whatever
//

/*
* Free list when unneeded
*/
for(p = head; p != NULL; ) {
printf("%s", p->string);
LIST *saved = p->next
free(p->string);
free(p);
p = saved;
}
return 0;
}

关于C 倒回来自命令输出的 FILE 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29530451/

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