我正在尝试将相对路径传递给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);
}
答案 0 :(得分:8)
in = fopen("path", " r ");
那里有两个错误:
path
"r"
要做到正确吗
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);
}