2016-10-07 7 views
1

以下のコードは入力を要求し、後でそれを印刷することになっています。

しかし、私はいくつかの問題に遭遇しました。
データの保存とデータの読み取り(Cプログラミング)


問題

  • プログラムは、私は、エントリを確認した後、作業を​​停止します。
  • 入力を印刷することになっている場合は、奇妙な記号が印刷されます。

質問

  • どのように私は、変数の値全体を印刷できますか?元については

    : - ときI入力 "ジョン・レモン" それは "名:" を尋ねたときのために。

    "John"の代わりに "John Lemon"を印刷することができます。

  • 変数の最初の値を印刷した後、変数の2番目の値と3番目の値を完全にどのように出力し続けますか?元については



    サンプル出力

    名:ジョンレモン

    年齢:21

    住所:41、2/2アップルストリート


私は何を行うことができますこの問題を解決するには?

可能であれば、私はCプログラミングを初めて学んだので、基本的に説明してください。

これが乱雑に見える場合は申し訳ありません。私は可能な限りシンプルに保つために最善を尽くしました。

#include<stdio.h> 

char fname[]={"guest.dat"}; 

struct text 
{ 
    char name; 
    int age; 
    char address; 

}; 

void printing() 
{ 
    struct text t1; 

    FILE *fp; 

    fp=fopen(fname,"r"); 

    printf("\nName: %c",t1.name); 
    printf("\nAge: %d",t1.age); 
    printf("\nAddress: %s",t1.address); 
} 

int main() 
{ 
    FILE *fp; 

    int choice; 

    struct text t1; 

    fp=fopen(fname,"a+"); 

    fread(&t1,sizeof(t1),1,fp); 

    printf("\nPlease enter name: "); 
    scanf("%c",&t1.name); 
    fflush(stdin); 

    printf("\nPlease enter age: "); 
    scanf("%d",&t1.age); 
    fflush(stdin); 

    printf("\nPlease enter address: "); 
    scanf("%s",&t1.address); 
    fflush(stdin); 

    printf("\nConfirm? (Y/N): "); 
    scanf("%c",&choice); 

    if (choice == 'y' | choice == 'Y') 
    { 
     fp=fopen(fname,"a+"); 
     fwrite(&t1,sizeof(t1),1,fp); 
     fclose(fp); 
     fflush(stdin); 
     system("cls"); 
     printing(); 
    } 
    else if (choice == 'n' | choice == 'N') 
    { 
     fflush(stdin); 
     system("cls"); 
     printing(); 
    } 
    else 
     fflush(stdin); 
     system("cls"); 
     printf("Please try again!"); 
     system("pause"); 
} 
+0

何らかの理由で、初心者のチュートリアルでは、常にscanf経由でユーザーとの対話型の対話が必要な例があります。 scanfは使用するのが少し難しいですが、それはすぐに明らかではありませんなぜトリッキーです。 –

+0

"C"の "char"型は、このコードを終了する前に、char配列の動作/ポインタとC – mou

答えて

2

あなたのプログラムプリント「奇妙な記号は」t1のでprinting機能で初期化されることはありません。あなたはファイルから読み取ることはありません。ここ

:さらに

void printing() 
{ 
    struct text t1; 
    FILE *fp; 
    fp=fopen(fname,"r"); 

    // Missing read from file 

    printf("\nName: %c",t1.name); 
    printf("\nAge: %d",t1.age); 
    printf("\nAddress: %s",t1.address); 
} 

、この行:

printf("\nAddress: %s",t1.address); 

は間違っています。 %schar*ですが、addresscharです。したがって、%cを使用する必要があります。 scanfaddressの場合も同様です。

おそらくstruct textに文字列を保存したかったでしょうか?その場合はchar arrayを使用してください。現在のところ、構造体はchar(名前とアドレスの単一の文字)のみを保持できます。

struct text 
{ 
    char name[100]; 
    int age; 
    char address[100]; 

}; 

をし、その後printfscanfの両方のための%sの代わり%cを使用します。たぶん、あなたは本当にやってみたかったです。

もここであなたには、いくつかの「奇妙な」コードがあります。そのほかに

int main() 
{ 
    FILE *fp; 
    int choice; 
    struct text t1; 

    // Why do you have the next to lines? Seems to be a mistake - remove them 
    fp=fopen(fname,"a+"); 
    fread(&t1,sizeof(t1),1,fp); 

を、あなたのコードは、戻り値のチェックのすべての種類を欠いています。 fopenfreadfwriteおよびscanfによって返された値を必ず確認してください。

+0

の "&"は "scanf("%c "、&t1。 name) 'はnameから' t1.name'と 'scanf("%d "、&t1.age)に入力を割り当てます。入力はageから' t1.age'に割り当てられますか? – sugar

+0

@sugar - はい、しかし、 '%c'は文字なので、名前はただ一つの文字です – 4386427

+0

私の入力から単語を読むには、私の値が'%c'として保存されていても '%s'を使いますか? – sugar

関連する問題