可变参数函数 - 读取文件 (c)

variadic function- reading files (c)

我需要创建一个可变参数函数(stdarg 库),它将遍历我传递给它的所有文件,并计算与我作为参数传递的单词相似的单词,

#include <stdio.h>
#include <stdarg.h>

void countWords(char* name, FILE* file, ...){
    va_list  params;
    FILE* currentFile;
    FILE* f;
    int words = 0;

    va_start(params, file); 
    currentFile = file;

    while (currentFile != NULL) 
    {

    f = fopen(currentFile, "r+"); //which file should i open every time? this doesnt compile

    // comparing words in each file code

    currentFile = va_arg(params, FILE*);
    }
      va_end(params);
}

我无法读取文件(无论我尝试什么都无法编译), 以及如何遍历每个文件来比较我的单词?非常感谢指导

谢谢!

如果您要传递文件名或更准确地说是文件路径,则此

FILE *currentFile;
currentFile = va_arg(params, FILE *);

应该是

char *currentFile;
currentFile = va_arg(params, char *);

如果你传递 FILE 指针,你不应该打开它们,因为如果程序的其余部分是正确的,那么它们应该已经在函数内部打开,否则传递 FILE *的。

所以函数大概应该是

#include <stdio.h>
#include <stdarg.h>

void countWords(char *word, char *filename, ...)
{
    va_list  params;
    FILE *file;
    int words;

    words = 0;
    va_start(params, file);
    while (filename != NULL) 
    {
        file = fopen(filename, "r+");
        // comparing words in each file code
        filename = va_arg(params, char *);
    }
    va_end(params);
}

你可以这样称呼它

countWords("example", "/path/to/file/1", ..., "/path/to/file/n", NULL);

你应该小心字符串文字,在这种情况下可能会使用 const 限定符,因为即使参数不是字符串文字,在 countWords() 中修改它们也没有意义所以为了防止意外修改它们 const 可能会有所帮助,尽管你总是可以修改它们。即使修改字符串文字会调用未定义的行为,您也不能完全禁止您的程序这样做。

i need to create a variadic function

除非这是关于可变参数函数的家庭作业,否则您根本不需要可变参数函数。可变参数函数不是类型安全的,类型安全是可取的 属性.

其他人已经指出了这一点:你需要一个函数,它接受一个文件名并计算一个单词在单个文件中的出现次数

size_t occurrences(const char *word, const char *filename) { ... }

然后您可以轻松地遍历一组文件,例如:

size_t count = 0;

for (int i = 1, i < argc; i++) {
    size += occurrence("pink", argv[i]);
}

如果愿意,您可以将它包装在一个单独的函数中,该函数接受一个文件名数组和一个文件计数。这很容易做到,因为无论您是从命令行还是从其他地方获取文件,您都已经将它们存储在某种数组中。

现在考虑变体变体,只有当您在编译时知道要处理的文件时才有意义,例如:

size_t n = var_occurrences("banana",
               "alpha.txt", "beta.txt", "gamma.txt", NULL);

同样可以用非可变方法实现:

const char *w = "banana";
size_t n = occurrences(w, "alpha.txt")
         + occurrences(w, "beta.txt")
         + occurrences(w, "gamma.txt");

这里打字有点多,但其他一切都简单得多。如果您必须使用可变参数函数,请继续查看 iharob 的回答。但是可变参数函数并不是解决您的任务的好方法。