关于fopen的问题 - 我在这里做错了什么?

时间:2010-10-02 03:28:44

标签: c

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

static char *dup_str(const char *s)
{
    size_t n = strlen(s) + 1;
    char *t = (char*) malloc(n);
    if (t)
    {
        memcpy(t, s, n);
    }
    return t;
 }

 static char **get_all_files(const char *path)
 {
    DIR *dir;
    struct dirent *dp;
    char **files;
    size_t alloc, used;
    if (!(dir = opendir(path)))
    {
        goto error;
    }
    used = 0;
    alloc = 10;
    if (!(files = (char**) malloc(alloc * sizeof *files)))
    {
        goto error_close;
    }

    while ((dp = readdir(dir)))
    {
        if (used + 1 >= alloc)
        {
            size_t new_thing = alloc / 2 * 3;
            char **tmp = (char**) realloc(files, new_thing * sizeof *files);
            if (!tmp)
            {
                goto error_free;
            }
            files = tmp;
            alloc = new_thing;
        }
        if (!(files[used] = dup_str(dp->d_name))) 
        {
            goto error_free;
        }
        ++used;
    }
    files[used] = NULL;
    closedir(dir);
    return files;
error_free:
    while (used--) 
    {
        free(files[used]);
    }
    free(files);
error_close:
    closedir(dir);
error:
    return NULL;
}

int main(int argc, char **argv)
{
    char **files;
    size_t i;

    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s DIRECTORY\n", argv[0]);
         return EXIT_FAILURE;
    }
    files = get_all_files(argv[1]);

    if (!files) 
    {
        fprintf(stderr, "%s: %s: something went wrong\n", argv[0], argv[1]);
        return EXIT_FAILURE;
    }

    for (i = 0; files[i]; ++i) 
    { 
        FILE *fp;
        if((fp = fopen(files[i],"r"))==NULL)
        {
            printf("error cannot open file\n");
            exit(1);
        }
        fclose(fp);
    }
    for (i = 0; files[i]; ++i) 
    {
        free(files[i]);
    }
    free(files);
    return EXIT_SUCCESS;
}

我刚收到“错误无法打开文件”。

2 个答案:

答案 0 :(得分:4)

如果我调用你的程序传递它/tmp作为参数。

files = get_all_files(argv[1]);

将返回/tmp中的所有文件,但是当您这样做时:

for (i = 0; files[i]; ++i) { 
  FILE *fp;
  if((fp = fopen(files[i],"r"))==NULL)

您正尝试从当前工作目录中打开这些文件。但它们存在于您作为参数传递的目录中,使fopen失败。

解决此问题

  • 将dir名称作为文件的前缀 被打开。或
  • 您可以使用chdir更改您的密码,然后执行fopen

答案 1 :(得分:1)

我认为有几个问题:

  1. readdir()返回路径中的子目录,甚至是“。”之类的条目。和“..”。
  2. 你试图打开返回的文件,但无论当前目录是什么 - 你需要连接你正在打开的文件名的路径。