2017-01-25 10 views
0

私はcプログラムが1行ずつテキストファイルを読み込み、その行を端末にプリントアウトさせたいと思っています。Cプログラムは、テキストファイルを1行ずつ読み込み、それらの行を端末に出力します。

私のコード

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char* line; 

    FILE *ifp; 
    ifp = fopen("BBE.txt", "r"); 
    if (ifp == NULL) 
    { 
     printf("Error opening file!\n"); 
     exit(1); 
    } 

    while (fscanf(ifp, "%s", line) == 1) 
    { 
     printf("%s\n", line); 
    } 

    fclose(ifp); 

    return 0; 
} 

私は端末に何をプリントアウトしていない、それを実行しようとするプログラム。これは、whileループは機能していないが、私は理由については確信していないと伝えています。

答えて

0

*lineを初期化せずに使用しました - >未定義の動作。

はそれを修正するには、代わりにchar型の配列を使用することができます。

char line[1000] = ""; 
+3

あなたは、*それを初期化せずに任意のメモリ*の代わりに*を割り当てることなく*ありません意味ですか? –

+0

@KenWhiteそれは '* line'ポインタが初期化されていないためです。 unitialised変数を使用するのはUBです。つまり、使用前に初期化する必要があります。つまり、有効な場所を指し示す必要があります。有効な場所を最初に割り当てる必要があります。 – artm

+0

OK。したがって、NULLに初期化するとうまくいくことをこのポスターに伝えていますか?この場合、変数はメモリ割り当てで初期化する必要があり、その使用にはメモリを最初に割り当てる必要があります。 –

1

あなたのループが動作していない、fscanfが成功した場合にだけ1を返さないので。

fscanfのmanページによると、戻り値は以下の意味があります成功し

返り値

を、これらの機能が正常にマッチした、割り当てられた 入力項目数を返します。早期のマッチングの失敗の場合には、これは、提供されるよりも少ないか、またはゼロでさえあり得る。

最初の変換が成功するか、一致するエラーが発生する前に入力の終了に達すると、値EOFが返されます。読み取りエラーが発生した場合は、EOFも返されます。この場合、ストリームのエラーインジケータ(ferror(3)を参照)が設定され、errnoがエラーを示すように設定されます。

はさらに、すでに別の答えに記載されている:あなたは、メモリへの書き込み なく、あなたのメモリである:

char* line; 

がcharへのポインタの単なる宣言です。あなたが必要とするのは、書き込む連続したcharの配列です。

あなたはどちらかがそれを宣言することにより、スタック上でこれを割り当てることができます。

char line[1000]; // Allocate a char array of the size of 1000. 

やヒープ上に、ここ

char* line = malloc(1000*sizeof(char)); // Allocate 1000 chars on the heap 

あなたはメモリを解放する必要があり、その後

free(line); 
関連する問題