2017-11-29 10 views
-1

ファイルを開く関数を作成し、この開いたファイルを他の関数で使用したいと考えています。ファイルが開かれるべきであるが、ファイルが空になると、実際にreadWholeFileは何も出力しないので、これは私のコード、ファイルを開く関数を作成し、他の関数でそれらを使用する方法

#include <stdio.h> 

int openFile(FILE* inputFile) 
{ 
    inputFile = fopen("input.txt", "r"); 

    if (inputFile != NULL) 
     return 0; 
    else 
     return -1; 
} 
void readWholeFile(FILE* inputFile) 
{ 
    char str[20]; 
    while (feof(inputFile)) { 
     fscanf(inputFile, str); 
     printf("%s\n", str); 
    } 
} 
int main() { 

    FILE* inputFile; 

    if (openFile(inputFile) == 0) { 
     readWholeFile(inputFile); 
    } 
    else 
     printf("File didn't open"); 
     fclose(inputFile);  

    return 0; 
} 

「ファイルが開けませんでした」が印刷されませんされています。どうしたの?

+0

'FILE * inputFile':ローカルでのみ割り当てられたファイルハンドルを失ってしまいます。* –

+0

' FILE * 'はあなたの関数の結果です。なぜ(そしてどのように)それを議論として渡すでしょうか?なぜあなたは関数からそれを単に返すのではないのですか? –

答えて

1

あなたのプロトタイプは意味をなさない、openFile()は、呼び出し側のFILE *それが値によって渡されたとき、あなたはそのような場合には、ポインタのアドレスを渡す必要が変更することはできません。

int openFile(FILE **inputFile) 
{ 
    *inputFile = fopen("input.txt", "rt"); 
    return *inputFile == NULL ? -1 : 0; 
} 

しかし、もちろん、これは非常に機能します小さな目的で、代わりにfopen()を直接ファイルを開く場所で使用してください。追加された値や情報を持たない別のintを管理する代わりに、開いているファイルへのポインタを返すほうが簡単です(またはNULLのポインタよりも0または-1の方が "良い"ではないint) 。

0

inputFileを返す必要があります。あなたは他の機能からそれを再利用することができます。 また、FILE*からopenFileに機能を渡すのはなぜですか?それは冗長です。

デザインごとのファイル名とrなどのパラメータを渡すことができ、wなど

FILE* openFile(const char*name, const char*params) 
{ 
    inputFile = fopen(name, params); 

    if (inputFile != NULL) 
     return inputFile; 
    else 
     return NULL; 
} 

しかし、あなただけのfopen()呼び出しを抽象化していることをやってインチ戻り値openFile()を確認する必要があります。あなたはダブルポインタを使用して同じことを達成することができますが、私は代替案を提供しました。

FILE *inputFile = openFile("input.txt","r"); 
if(!inputFile){ 
    //... 
} 

事が限り、これは本当にfopen()呼び出しをラップ以外の何かをやっている示した方法としてあります。この答えから、関数内でポインターを渡すことができ、関数を使用する方法を知ることができます。

他の回答は、ダブルポインタの使い方を示していますが、前のケースで何が起こったのでしょうか?

openFile()に渡されるローカル変数を変更しています。あなたはそれを変更する。そして関数が完了すると、そのローカル変数はもう存在しません。 main()の変数FILE*には影響ありません。

ファイルを開くには、この方法は必要ありません。 2本の線だけを使用する方が良いでしょう。何も改善がないので。直接fopenコールの場合と同じように、戻り値を確認する必要があります。

関連する問題