【发布时间】:2016-04-25 14:06:27
【问题描述】:
在 C 语言中,我经常希望以相同的方式处理从文件读取的数据和从字符串数组读取的数据。通常从文件中读取是为了生产,从字符串中读取是为了测试。我最终写了很多这样的代码:
void handle_line(char *line, Things *things) {
...
}
Things *read_from_chars(char *lines[]) {
Things *things = Things_new();
for (int i = 0; lines[i] != NULL; i++) {
handle_line(lines[i], things);
}
return things;
}
Things *read_from_input(FILE *input) {
char *line = NULL;
size_t linelen = 0;
Things *things = Things_new();
while (getline(&line, &linelen, input) > 0) {
handle_line(line, things);
}
return things;
}
这是重复劳动。
有没有办法让字符串数组伪装成FILE * 指针?或相反亦然?还是有更好的模式来处理这个问题?
对于加分:解决方案应使char * 或char ** 可与fgets 和getline 等标准文件函数一起使用。
【问题讨论】:
-
没有内置任何东西。你的方法对我来说看起来不错。如果您使用 C++,您可以使用类或重载函数,但 C 没有类似的东西。
-
您可以通过创建带有可变参数的函数来重载。 耸耸肩。
-
你能写一个把文件读入char*列表的函数吗?比如 read_from_chars(get_lines(file));
-
您当前的解决方案实际上没有任何重复工作。通用代码在一个通用函数
handle_line中,read_from_chars和read_from_input这两个函数做了两个不同的任务(其实就是你需要支持的两个任务)。这将是该问题的正常解决方案。更复杂的方法是处理函数在需要一行时调用回调来读取一行 -
@user3125280 这不是一个好的解决方案,因为将整个文件读入内存效率很低。