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);
}
in = fopen("path", " r ");
そこに2つの誤りがあります。
path
にあるファイルが必要です。"r"
それらを正しくするために
in = fopen(path, "r");
まず、path
のarray[0]
のコンテンツに合わせるために、strcat
にスペースを追加する必要があります。そうしないと、割り当てられた領域を超えて書き込みます。
次に、"path"
を二重引用符で囲んだため、path
をfopen
に渡していません。
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);
}
あなたの問題は、fopen
とは何の関係もなく、C文字列の処理に関するすべてのことを行います。strcat
は、宛先バッファに文字列全体に十分なメモリを必要としますが、initial文字列に十分なメモリを提供します。悪い!ちなみに、valgrind
などのツールを使用すると、不正アクセスについてすぐにわかります。
これは素朴な解決策です:
char buf[1000] = { };
strcat(buf, "./textfiles/");
strcat(buf, array[0]);
// ...
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);
}