gpt4 book ai didi

c - 在 C 中读取文件和字符串数组

转载 作者:太空宇宙 更新时间:2023-11-04 08:13:54 24 4
gpt4 key购买 nike

我有一个函数 void* producer(void* param) 传递给多个 POSIX 线程,其目标是读取 文件 的每一行或每个string (char*) array 行并处理它们。

问题:如何让这个函数优雅地适应这两个可能的输入? (我猜第一个是文件的文件名或 FILE*)。

到目前为止,该函数只能读取一个文件,这是它的代码:

void* producer(void* param)
{
FILE* filep = *(FILE*)param;

char line[256];

while (fgets(line, 256, filep) != NULL)
{
processLine(line);
}

return NULL;
}

最佳答案

提供一个结构,它知道如何根据其内容生成下一行。例如(未经测试):

typedef struct {
FILE *fp;
const char *str;
} Source;

Source *source_new_from_file(const char *filename)
{
Source *ret = malloc(sizeof(Source));
if (!ret)
return NULL;
ret->fp = fopen(filename, "rb");
if (!ret->fp)
return NULL;
ret->str = NULL;
return ret;
}

Source *source_new_from_str(const char *str)
{
Source *ret = malloc(sizeof(Source));
if (!ret)
return NULL;
ret->fp = NULL;
ret->str = str;
return ret;
}

bool source_read_line(Source *s, char *dest, size_t destsize)
{
if (s->fp)
return fgets(dest, destsize, s->fp) != NULL;

const char *newline = strchr(s->str, '\n');
if (!newline)
// handle trailing line without newline, like fgets does
newline = s->str + strlen(s->str);
if (newline == s->str)
return false; // no more data

size_t linelen = newline - s->str;
if (linelen > destsize - 1)
linelen = destsize - 1;
memcpy(dest, s->str, linelen);
dest[linelen + 1] = '\0';
s->str = newline;
return true;
}

// ...

void* producer(void* param)
{
Source *source = param;
char line[256];

while (source_read_line(source, line, sizeof line)) {
processLine(line);
}

return NULL;
}

使用此代码,您可以将任何类型的源传递给生产者。即使出现了一种新的源(例如,数据库查询的结果集,或者“行”被编码为 XML 元素的 XML 文档),您也只能通过扩展 source_read_line 来实现新功能,并且不更改 producer 中的任何代码。

关于c - 在 C 中读取文件和字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37070895/

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