2016-12-13 8 views
-3

2つのchar []と1つのintを持つ構造体を作成しました。私はこの構造体の配列を作成し、配列にデータを格納するためにいくつかの入力を受けました。次に、このデータをファイルに書き込むためにfprintfを使用しました。しかし、私がファイルを開くと、私はすべての新しいレコードの前にûを得ます。 Idkなぜそれが起こっている。どこから来たものは珍しい文字がある ûdalla03332228458dallaÈfsÇûÿÿÿÿàrancho03312041265dallabanchoファイルに書き込むときの異常な文字

:ここ

FILE *outputFile=fopen("1021.txt","ab"); 
int tickets=0,i=1; 
struct air s[30]; 
printf("\nEnter Number of tickets:"); 
scanf("%d",&tickets); 
for (i=1;i<=tickets;i++) 
{ 
    printf("\nEnter the name\t"); 
    scanf("%s",&s[i].name); 
    printf("\nEnter the phone number\t"); 
    scanf("%s",&s[i].phoneNo); 
    printf("\n Enter the address\t"); 

    scanf("%s",&s[i].address); 
    printf("Your ticket is confirmed\t"); 
    getch(); 
} 
for (i=0;i<=tickets;i++) 
{ 
    printf("%s", s[i].name); 
    printf("%s", s[i].phoneNo); 
    printf("%s", s[i].address); 
    fprintf(outputFile,"%s",s[i].name); 
    fprintf(outputFile,"%s",s[i].phoneNo); 
    fprintf(outputFile,"%s",s[i].address); 
} 

私は、ファイルに何を得るです:

ここでは、関連するコードですか?

+3

[MCVE](http://stackoverflow.com/help/mcve)必須、 'struct air'とは何ですか? –

+3

バイナリファイルとテキストファイルの入出力を混在させるのはなぜですか? –

+1

C配列の索引付けは「0」に基づいています。 "for(i = 0; i

答えて

4

ご入力ループが

for (i=1;i<=tickets;i++) 

であるが、出力ループは

for (i=0;i<=tickets;i++) 

ですから、あなたが入力したデータがない要素[0]からファイルにデータを書いているです。だからこそジャンクです。

Cでは、配列は[0]から索引付けされ、どちらのループも正しくありません。あまりにもコード内の他の問題があります

for (i = 0; i < tickets; i++) 

にそれらの両方を変更するが、これはすぐに「未初期化データ」問題に対処してください。

編集:その他の問題。

ファイルを「バイナリ」モードで開いたのに、テキストファイルとして使用しています。私はこの区別がWindowsでのみ必要だと考えています。 scanfに渡さ

FILE *outputFile=fopen("1021.txt", "at"); // change to "t" 

文字列のアドレスは(intとは違って)&アドレス-のを含めることはできません。配列を渡すだけで、必要なポインタまで減衰します。

scanf("%s", s[i].name);      // removed `&` 

あなたの文字列データをデマーク方式ために、ファイルに改行を書いていないとして、あなたは後ろにデータを読み込む際に、各終了し、次の始まる場所、あなたは知ることができません。例えば、この

fprintf(outputFile, "%s\n", s[i].name);  // added \n 

ようnewlineを追加しますので、一つのメンバーは、おそらく電話番号intであると言うが、あなたは文字列として入力しています。しかし、a)thayには'+'などの文字が含まれている可能性があります。またはb)は0の先頭から始まり、intとして保存すると失われてしまうため、電話番号を整数として保存するのは悪い考えです。したがって構造体phoneNoを適切な長さのchar配列に変更します。入力文はこのような良くなるよう

scanf形式指定子%sは、newlineを発見または長さの制限に達したときにのみ停止する、それが出会う最初の空白で停止する:

int res = scanf("%29[^\n]", s[i].name); 

定義された配列の長さは[30]でした(構造体を表示していません)。あるいは、fgets()の使用方法を調べることもできます。

最後に、呼び出し元の関数の戻り値が正常かどうかを確認する必要があります。 fopenはファイルが正しく開かれたかどうかを教えてくれます。 scanfはスキャンしたエントリの数を示し、fgetsは成功したかどうかを知らせます。

関連する問題