2016-10-07 2 views
1

Код ниже запросит ввод и должен его распечатать.

Однако я столкнулся с несколькими проблемами.
Сохранение данных и чтение данных (программирование на С)


Проблемы

  • программа перестает работать после того, как я подтвердить ввод.
  • , когда предполагается напечатать вход, вместо этого распечатывает странные символы.

Вопросы:

  • Как напечатать целое значение переменной?

    Для экс: - Когда я вход "John Lemon", когда он просит "Имя:".

    Я мог бы напечатать "John Lemon" вместо "John".

  • После печати первого значения переменной, как я могу продолжить печать второго значения и третьего значения переменной целиком?

    Для экс:

    Пример вывода

    Имя: John Lemon

    Возраст: 21

    Адрес: 41, 2/2 Apple, Street


Что я могу сделать устранить эту проблему?

Если возможно, объясните, пожалуйста, в терминах непрофессионала, поскольку я новичок в программировании на С.

Извините, если это выглядит грязно. Я старался изо всех сил держать его как можно проще.

#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

«char» тип в C является единственным символом, перед тем как закончить этот код, вы должны посмотреть, как работает массив/указатель 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); 

неправильно. Вы используете %s, который предназначен для char*, но address является char. Поэтому вы должны использовать %c. То же самое относится к scanf от address.

Возможно, вам действительно захотелось struct text, чтобы держать строки !?Если это так, вы должны были использовать char array. В настоящее время структура может содержать только char (т. Е. Одну букву для имени и адреса). Может быть, вы действительно хотели сделать:

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

}; 

, а затем использовать %s вместо %c как для printf и scanf.

Кроме того, здесь у вас есть какой-то «странное» код:

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

Кроме того, ваш код не хватает всех видов проверок возвращаемых значений. Всегда проверяйте значение, возвращаемое fopen, fread, fwrite и scanf.

+0

так «scanf («% c », & t1. name) 'будет присваивать вход от имени' t1.name' и 'scanf ("% d ", & t1.age)' будет назначать вход от возраста до 't1.age'? – sugar

+0

@sugar - да, но обратите внимание, что '% c' является символом, поэтому имя - это всего лишь одна буква – 4386427

+0

, чтобы прочитать слово из моего ввода, я использую'% s', хотя мое значение сохраняется как '% c'? – sugar

Смежные вопросы