Передайте относительный путь к fopen () - PullRequest
11 голосов
/ 03 февраля 2012

Я пытаюсь передать относительный путь к fopen (), но он не может найти файл.Мне нужно это для работы на Linux.Имена файлов (например, t1.txt) сохраняются в массиве.Так что все, что мне нужно, это «передняя часть» относительного пути.

Вот мой код:

// Use strcat to create a relative file path
char path[] = "./textfiles/"; // The "front part" of a relative path
strcat( path, array[0] ); // array[0] = t1.txt

// Open the file
FILE *in;
in = fopen( "path", " r " );
if (!in1) 
{
    printf("Failed to open text file\n");
    exit(1);
}

Ответы [ 4 ]

8 голосов
/ 03 февраля 2012
in = fopen("path", " r ");

Две ошибки:

  1. Вы не хотите открывать файл с буквальным именем «path», вам нужен файл, имя которого находится в переменной path
  2. аргумент режима недействителен; Вы хотите "r"

Чтобы понять их правильно, сделайте

in = fopen(path, "r");
7 голосов
/ 03 февраля 2012

Во-первых, вам нужно добавить некоторое пространство к path, чтобы вместить содержимое array[0] в strcat, иначе вы будете писать за выделенной областью.

Во-вторых, выне передают path в fopen, потому что вы заключили "path" в двойные кавычки.

char path[100] = "./textfiles/"; // Added some space for array[0]
strcat( path, array[0] );

// Open the file
FILE *in;
in = fopen( path, " r " ); // removed quotes around "path"
if (!in) 
{
    printf("Failed to open text file\n");
    exit(1);
}
3 голосов
/ 03 февраля 2012

path достаточно большой, чтобы содержать символы, с которыми он был инициализирован. Размер path должен быть увеличен. Выделите память для path на основе добавляемого имени файла:

const char* dir = "./textfiles/";
const size_t path_size = strlen(dir) + strlen(array[0]) + 1;
char* path = malloc(path_size);
if (path)
{
    snprintf(path, path_size, "%s%s", dir, array[0]);

    in = fopen(path, "r"): /* Slight differences to your invocation. */

    free(path);
}
3 голосов
/ 03 февраля 2012

Ваша проблема не имеет ничего общего с fopen и всем, что связано с обработкой строки C: strcat требуется достаточно памяти в целевом буфере для всей строки, но вы предоставляете достаточно памяти только для начального строка. Плохой! Кстати, использование таких инструментов, как valgrind, немедленно сообщит вам о вашем незаконном доступе.

Вот наивное решение:

char buf[1000] = { };
strcat(buf, "./textfiles/");
strcat(buf, array[0]);

// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...