вопрос по fopen - что я тут не так делаю? - PullRequest
1 голос
/ 02 октября 2010
#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 ]

4 голосов
/ 02 октября 2010

Если я вызову вашу программу, передав ее /tmp в качестве аргумента.

files = get_all_files(argv[1]);

вернет все файлы в /tmp, но когда вы сделаете:

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

вы пытаетесь открыть эти файлы из текущего рабочего каталога. Но они присутствуют в каталоге, который вы передали в качестве аргумента, что приводит к ошибке fopen.

Чтобы исправить это

  • вы добавляете имя файла в файл быть открытым. или
  • Вы можете изменить свой pwd, используя chdir , а затем выполнить fopen s.
1 голос
/ 02 октября 2010

Пара проблем, я думаю:

  1. readdir() возвращает подкаталоги в пути, даже такие записи, как "."и "..".
  2. вы пытаетесь открыть возвращенные файлы, но в каком бы текущем каталоге вы ни находились - вам нужно объединить путь к открываемому вами файлу.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...