2012-01-18 24 views
1

2つのファイルポインタを含む構造体を作成しようとしています。私は、ファイルを開閉する機能を使用するためにこれを使用できるようにしたいと思いC言語、ファイルの構造

typedef struct dataFiles 
    { 
     FILE * inputSet; 
     FILE * outputSet; 
    }fData; 

、私はここ1を持っている(下記参照):

void openFiles(struct dataFiles * fiData) 
    { 
     fiData->inputSet = fopen("inputfile.txt","r"); 
     fiData->outputSet = fopen("outputfile.txt","o"); 
     return fiData; 
    } 

主な機能では私が最初に

openFiles(&fileData); 
:経由して、それを試してみて、アクセスした後

fdata * fileData; 

:として構造体を宣言

私のプログラムが実行され、コンパイルされますが、私は出力ファイルをチェックするとinputfileからstructにデータを取得する際に問題が発生します。すべて0です。このタイプのコードを実装する方法に関する一般的なヒントは、高く評価されます。 (注:これは学校の課題に関する質問ですが、私は既に課題の要件を満たしており、自分の好奇心のためにこれに興味を持っています)〜ありがとう!それが好き

+2

あなたが投稿したコードから少なくとも2つの事柄について不平を言っている(少なくとも警告) - 'void'関数の非void式を返し、' openFiles() 'への間違った種類のポインタを渡そうとすると、 '。 'fileData'宣言のタイプミスはもちろんです。 –

+0

を副次的に書いておきますが、ASCIIファイルだけを開いている場合を除き、fopenに "b"フラグを付けてください。すなわち 'fopen(filename、" rb ")'を使用します。違いは、ファイルがなければEOFを早く得ることです。 – chacham15

+1

あなたのプログラムは警告なしでコンパイルされますか? ヒント:コンパイラ警告を無視しないでください! – asaelr

答えて

1

宣言:

fdata fileData; //This memory is on the stack, not the heap

メモリがスタックにし、ヒープ内の、2つの場所にすることができます。スタック上のメモリを割り当てる必要はありません。そのメモリへの参照を取得するだけで済みます。したがって、&fileDataを実行すると、必要なポインタが取得されます。ただし、スタック上のデータへのポインタを返すことはできません。したがって、ヒープへのポインタが必要です。ヒープ内のメモリへのポインタを作成するには、必要なメモリのサイズでmallocを呼び出します。この場合はmalloc(sizeof(fileData))です。これは、あなたがfileData *にキャストする必要があるvoid *を返します。

はまた、あなたが、その後&fileDataが一致しないであろうタイプfdata **であろうfdata *としてfileDataを宣言している場合ではなく、その後

fdata fileData; 

openFiles(&fileData); 

としてそれを宣言する

fData openFiles(struct dataFiles * fiData)

0

void openFiles(struct dataFiles * fiData)
を変更します関数のパラメータの型。

0

ポインタを変数と混合しています。あなたの機能が動作するには、次のようにFILEDATAを宣言する必要があります。

fdata fileData; 

を(ポインタなし)、およびopenFilesreturnを削除します。引数が参照によって変更されるため、必要ありません。

0

問題が発生しました。 openFilesfData*になりますが、fData**に渡します。

fileData=malloc(sizeof(fData)); 
openFiles(fileData); 

編集:ちょうどまたはfDatafileDataにタイプを変更し、そのアドレスを渡す あなたのような何かを行う必要があります。

関連する問題