2016-10-07 2 views
1

Der folgende Code fragt nach Eingabe und soll danach drucken.

Ich habe jedoch mehrere Probleme festgestellt.
Daten speichern und Daten lesen (C-Programmierung)


Probleme

  • Programm nicht mehr funktioniert, nachdem ich die Eingabe zu bestätigen.
  • wenn es die Eingabe drucken soll, druckt es stattdessen seltsame Symbole aus.

Fragen:

  • Wie drucke ich den ganzen Wert der Variablen?

    Für ex: - Wenn ich Eingang "John Lemon" denn wenn es fragt nach "Name:".

    Ich wäre in der Lage zu drucken "John Lemon" anstelle von "John".

  • Nach dem Drucken des ersten Wertes der Variablen, wie kann ich weiterhin den zweiten Wert und den dritten Wert der Variablen vollständig drucken?

    Für ex:

    Beispielausgabe

    Name: John Lemon

    Alter: 21

    Adresse: 41, 2/2 Apple-Straße


Was kann ich tun um dieses Problem zu beheben?

Wenn möglich, bitte erklären Sie in Laien, wie ich neu in der C-Programmierung bin.

Sorry, wenn das unordentlich aussieht. Ich habe mein Bestes versucht, um es so einfach wie möglich zu halten.

#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

Aus irgendeinem Grund beginnen Anfänger Tutorials immer mit Beispielen, die interaktive Dialoge mit dem Benutzer über scanf erfordern. scanf ist ein bisschen schwierig zu bedienen und es ist nicht sofort offensichtlich, warum es schwierig ist. –

+0

"char" Typ in C ist ein einzelnes Zeichen, bevor Sie diesen Code beenden, sollten Sie schauen, wie Char Array funktioniert/Zeiger, und was "&" in C – mou

Antwort

2

Ihr Programm druckt "weird Symbole", weil t1 wird nie in der printing Funktion initialisiert.

Sie hier nie aus der Datei lesen:

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); 
} 

Ferner diese Zeile:

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

falsch ist. Sie verwenden %s, was für char* ist, aber address ist ein char. Sie müssen also %c verwenden. Gleiches gilt für die scanf von address.

Vielleicht wollten Sie wirklich struct text halten Strings !?Wenn ja, sollten Sie eine char array verwendet haben. Derzeit kann die Struktur nur char (d. H. Ein einzelner Buchstabe für Name und Adresse) enthalten. Vielleicht wollte man wirklich tun:

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

}; 

und dann %s sowohl für printf und scanf statt %c zu verwenden.

Auch hier haben Sie einige „seltsame“ Code:

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); 

Abgesehen davon, Ihr Code alle Arten von Kontrollen der Rückgabewerte fehlen. Überprüfen Sie immer den von fopen, fread, fwrite und scanf zurückgegebenen Wert.

+0

so 'scanf ("% c ", & t1. name) 'wird die Eingabe von name zu' t1.name' und 'scanf ("% d ", & t1.age)' wird die Eingabe von Alter zu 't1.age'? – sugar

+0

@sugar - ja, aber beachte, dass '% c' ein char ist, also name ist nur ein einzelner Buchstabe – 4386427

+0

um ein Wort aus meiner Eingabe zu lesen, benutze ich'% s', obwohl mein Wert als '% c' gespeichert ist? – sugar