将相对路径传递给fopen()

时间:2012-02-02 22:17:41

标签: c linux file-io

我正在尝试将相对路径传递给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 个答案:

答案 0 :(得分:8)

in = fopen("path", " r ");

那里有两个错误:

  1. 您不想打开名为“path”的文件,您希望名称在变量path
  2. 中的文件
  3. mode参数无效;你想要"r"
  4. 要做到正确吗

    in = fopen(path, "r");
    

答案 1 :(得分:7)

首先,您需要为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);
}

答案 2 :(得分:3)

你的问题与fopen和C字符串处理无关:strcat在整个字符串的目标缓冲区中需要足够的内存,但是你只为提供足够的内存初始字符串。坏!顺便说一下,使用像valgrind这样的工具可以立即告诉您非法访问。

这是一个天真的解决方案:

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

// ...

答案 3 :(得分:3)

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);
}