2015-09-12 3 views
-1

Я пытаюсь открыть файл в подкаталоге «Файлы». Я знаю, как открыть файл в поддиректории, если я знаю имя:Как открыть файл в подкаталоге в c

fopen("./Files/file.txt", "r"); 

Однако, я пытаюсь создать файл, который будет открывать любые файлы в подкаталоге без необходимости знать имена файлов впереди времени. Я использую функцию reaaddir(), чтобы иметь возможность найти имя файла, однако я не уверен, как подключить его к fopen, чтобы открыть и прочитать файл. Функция readdir() автоматически сохраняет имя файла в dp_> d_name. Тогда если я это сделать:

fopen("./Files/dp->d_name", "r"); 

программа будет пытаться открыть файл с именем «DP-> d_name», а не имя файла, хранящегося в этом месте.

Если у вас нет способа сделать это, есть ли способ изменить текущий рабочий каталог из программы? Каждый файл, который я хочу открыть, находится в одном и том же подкаталоге, поэтому это будет приемлемым решением.

Вот мой код, для справки:

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

void readFile(int) 
{ 
     DIR *dir; 
     struct dirent *dp; 
     char * file_name; 
     char buffer[100]; 
     FILE *out; 
     FILE *in; 
     char outName[] = "filenames.txt"; 

     if ((out = fopen(outName, "w+")) == NULL) 
     { 
       printf("Can't open %s for writing.\n", outName); 
       return 2; 
     } 

     dir = opendir("./Files/"); 
     while ((dp=readdir(dir)) != NULL) 
     { 
       if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) 
       { 
        //do nothing... 
       } 
       else 
       { 
         if ((in = fopen(dp->d_name, "r")) == NULL) 
         { 
           printf("Can't open %s for writing.\n", dp->d_name); 
           return 2; 
         } 

         fgets(buffer, 100, in); 
         printf("\"%s\"\n", buffer); 
       } 
     } 
     closedir(dir); 
     fclose(out); 
     return 0; 
} 
+0

Используйте 'strcat()' для объединения строк. – Barmar

+3

Вы * делаете * знаете о, например. [ 'Snprintf'] (http://en.cppreference.com/w/c/io/fprintf)? –

+2

Вы можете изменить каталоги с помощью 'chdir()'. – Barmar

ответ

0

вы можете создать полное местоположение файла в другой переменной путем присоединения «./Files/» перед DP-> d_name. вы можете использовать strcat() для него или использовать create char * с достаточным размером для хранения всего местоположения, а затем заполнить его с помощью цикла for, а затем использовать эту переменную в fopen. например. , если dp-> d_name = "f1.txt", затем создайте переменную, newFileName = "./Files/f1.txt", а затем fopen (newFileName, "r");