web-dev-qa-db-ja.com

相対パスをfopen()に渡します

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);
}
12
Dino55
in = fopen("path", " r ");

そこに2つの誤りがあります。

  1. 文字通り「パス」という名前のファイルを開くのではなく、名前が変数pathにあるファイルが必要です。
  2. モード引数が無効です。あなたが欲しい"r"

それらを正しくするために

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

まず、patharray[0]のコンテンツに合わせるために、strcatにスペースを追加する必要があります。そうしないと、割り当てられた領域を超えて書き込みます。

次に、"path"を二重引用符で囲んだため、pathfopenに渡していません。

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

あなたの問題は、fopenとは何の関係もなく、C文字列の処理に関するすべてのことを行います。strcatは、宛先バッファに文字列全体に十分なメモリを必要としますが、initial文字列に十分なメモリを提供します。悪い!ちなみに、valgrindなどのツールを使用すると、不正アクセスについてすぐにわかります。

これは素朴な解決策です:

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

// ...
3
Kerrek SB

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
hmjd