2016-09-16 20 views
0

私はGPSからtxtファイルにいくつかのデータを保存しようとしています。問題はまずプログラムを停止した後に.txtファイルが空であったことですが、コードを実行すると無限の分岐に入り、画面または.txtファイルにデータを表示しないようになっています。fprintf空白のファイルを私に教えてください

char add_aux_XS[50],file_name_XS[256],file_txt_name_XS[256]; 
FILE *Ublox_text; 

char * txt_file_UB() { 
    printf("Name of txt file (include extension txt): \n"); 

    scanf("%s",file_name_UB); 

    strcpy(add_aux_UB,"/home/debian/Desktop/Comunicacion/gps/"); 

    sprintf(add_UB,"%s%s",add_aux_UB,file_name_UB); 

    return add_UB; 
} 

main() 
{ 
    file_txt_UB=txt_file_UB(); 
    for(i=0;i<256;i++){file_txt_name_UB[i]=*(file_txt_UB+i);} 
    Ublox_text=fopen(file_txt_name_UB,"w"); 
    fprintf(Ublox_text,"\n"); 

    Ublox_UART=Conf_Ublox(); 
    while(1) 
    { 
     struct UBLOX_message Read_UB=Reading_UBLOX(Ublox_UART); 
     printf("Valid: %c \t lat: %lf \t lon: %lf \t north: %lf \t east: %lf \n", 
      Read_UB.valid,Read_UB.lat,Read_UB.lon,Read_UB.north,Read_UB.east); 

     fprintf(Ublox_text,"%c \t %lf \t %lf \t %lf \t %lf \n", 
      Read_UB.valid,Read_UB.lat,Read_UB.lon,Read_UB.north,Read_UB.east); 
    }  
    fclose(Ublox_text);  
    close_Ublox(); 
} 

私はfprintf行をコメントすると、プログラムがOKで、画面内にセンサ値を印刷します。

+0

'for(i = 0; i <256; i ++){file_txt_name_UB [i] = *(file_txt_UB + i);}'で初期化されていない文字列をコピーすることは、実際にはそれを有効に初期化しません。あなたの 'text_file_UB()'関数は未定義の変数のすべての種類を使用しています - それは良くありません。あなたはMCVE([MCVE])の作成方法を読んだ後、質問が編集されるように編集する必要があります。 –

答えて

1

私にはまっすぐなようです - あなたは無限のwhile (1)ループを持っているので、決して終わらないでしょう。

プログラムを中止すると、fcloseに到達しなかったので、すべてのバッファ書き込みはが破棄されてになります。

ループ内にfflush()を追加すると、毎回書き込むことができますが、それはかなり遅くなります(通常、OSがすべての書き込みをバッファリングする理由があります)。しかし、よりよい解決策は、無限ループを修正することです。そのため、ある時点で終了します。

+0

お返事ありがとうございます。問題は、テスト中にGPSを常時読み取る必要があることです。テストがどれくらいの期間可能なのか分かりません.1分で済むので、私は無限ループを使用します。 –

+0

物事を遅くすることは悪いことではないかもしれません。 'Reading_UBLOX()'が高速であれば、* lot *の出力が得られます。ループ内に 'fflush(Ublox_text)'を追加して、何が起こるかを見てください。それが問題を遅らせるなら、 'fflush()'をN回繰り返すごとに1回呼び出すことを検討してください。 –

+0

@JuanBravo:テストが終わったとき、あなたのプログラムはどのように知っていますか?あなたは 'Reading_UBLOX()'によって返された値をチェックしていないようです。つまり、報告したエラーやEOFのような通常のイベントには注意を払っていません。それが現れても、あなたのプログラムには死の脅威(割り込みなどのシグナル)が送られなければなりません。ほとんどエレガント。 –

関連する問題