1

複数のファイルを作成しているプログラムがあります。作成するファイルごとに関数があります。各関数内には、ファイル名を作成し、書き込み用にファイルを開いて作成し、そのアクセス許可を設定し、最後にファイルを閉じるためのまったく同じコードがあります。毎回同じコードを使用する代わりに、ファイルを開いて閉じる関数を作成して、それを呼び出すことができるようにすることにしました。以前は、各関数のコードは次のようになりました。

void WriteFile1(char *name) {
   FILE *file;
   char *filename; //This is being malloc'ed because it initially consisted of multiple strings

   if (!(filename = malloc(sizeof(char *) * (strlen(name) + 1)))) MallocError();
   if (!(file = fopen(filename, "w"))) {
       fprintf(stderr, "Unable to open %s. Exiting \n", filename);
       exit(1);
   }
   fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH);

   //a bunch of fprintf statements here

   if (fclose(file)) {
       fprintf(stderr, "Error closing %s. Exiting...\n", filename);
       exit(1);
   }
}

これは完全にうまくいきました。問題はありませんでした。これで、次のようになります。

void WriteFile1() {
FILE *file;

OpenFile(file, "filename.asdf");
//fprintf statements
CloseFile(file, "filename.asdf");
}

void OpenFile(FILE *file, char *name) {
   if (!(file = fopen(name, "w"))) {
      fprintf(stderr, "Unable to open %s. Exiting... \n", name);
      exit(1);
   }
   fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH);
}
void CloseFile(FILE *file, char *name) {
    if (fclose(file)) {
        fprintf(stderr, "Error closing %s. Exiting...\n", name);
        exit(1);
    }
}

WriteFile1()の最初のfprintfステートメントに到達するとすぐに、障害が発生します。FILE変数で何か間違ったことをしていますか?以前と同じように機能するはずです。唯一の違いは、ファイル名文字列のmallocです。これは、代わりに名前として渡し、実際の値を引用符で囲んでいます。

ありがとうございました

4

3 に答える 3

2

このコードは間違っています:

void OpenFile(FILE *file, char *name) {
   if (!(file = fopen(name, "w"))) {

ここでは、ローカルfile変数に代入しています。を返す必要がfileあるため、WriteFile1() 関数はその FILE* で動作します

void WriteFile1() {
FILE *file;

file = OpenFile("filename.asdf");
//fprintf statements
CloseFile(file, "filename.asdf");
}

FILE * OpenFile(char *name) {
   FILE * file;
   if (!(file = fopen(name, "w"))) {
      fprintf(stderr, "Unable to open %s. Exiting... \n", name);
      exit(1);
   }
   fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH);
   return file;
}
于 2011-06-13T15:22:04.067 に答える
1

open 関数は次のようになります。

FILE *  OpenFile( char *name) {
   FILE * file;
   if (!(file = fopen(name, "w"))) {
      fprintf(stderr, "Unable to open %s. Exiting... \n", name);
      exit(1);
   }
   fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH);
   return file;
}

あなたのバージョンでは、 FILE * は事実上、関数のローカル変数 (パラメーターであるため) です。関数内で変更しても、外部では変更されません。

ポインターを返す関数 (またはそれ以外のこと) を設計するときはreturn、パラメーター リストを使用してポインターを返すよりも、ステートメントを介してポインターを返すことを常に優先してください。

于 2011-06-13T15:21:16.670 に答える
1

これ:

filename = malloc(sizeof(char *) * (strlen(name) + 1))

次のようにする必要があります。

filename = strdup(name);

持っている場合は、そうでない場合は次のようになります。

if((filename = malloc(strlen(name) + 1)) != NULL)
{
   strcpy(filename, name);
   ...
}

char特に、各文字はではなく、単なる であることに注意してくださいchar *sizeof (char) == 1は常に true であるため、これを使用しても意味がありません。

于 2011-06-13T15:23:56.890 に答える