数据保存和数据读取(C编程)

数据保存和数据读取(C编程),c,C,下面的代码将要求输入,并应在输入后打印然而,我遇到了几个问题。问题 我确认输入后,程序停止工作 当它应该打印输入时,它反而打印出奇怪的符号 问题: 如何打印变量的整个值? For ex:-当我输入“John Lemon”时,它会询问“Name:”我可以打印“John Lemon”而不是“John”。 打印变量的第一个值后,如何继续完整打印变量的第二个值和第三个值? 对于ex:样本输出姓名:John Lemon年龄:21地址:苹果街2/2号41号 我能做些什么来纠正这个问题 如果可能的话

下面的代码将要求输入,并应在输入后打印

然而,我遇到了几个问题。

问题

  • 我确认输入后,程序停止工作
  • 当它应该打印输入时,它反而打印出奇怪的符号

问题

  • 如何打印变量的整个值?

    For ex:-当我输入“John Lemon”时,它会询问“Name:”

    我可以打印“John Lemon”而不是“John”。

  • 打印变量的第一个值后,如何继续完整打印变量的第二个值和第三个值?

    对于ex

    样本输出
    姓名:John Lemon
    年龄:21

    地址:苹果街2/2号41号


我能做些什么来纠正这个问题

如果可能的话,请用外行术语解释,因为我是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");
}
#包括
char fname[]={“guest.dat”};
结构文本
{
字符名;
智力年龄;
字符地址;
};
空印()
{
结构文本t1;
文件*fp;
fp=fopen(fname,“r”);
printf(“\n名称:%c”,t1.名称);
printf(“\n管理:%d”,t1.年龄);
printf(“\n地址:%s”,t1.地址);
}
int main()
{
文件*fp;
智力选择;
结构文本t1;
fp=fopen(fname,“a+”);
fread(&t1,sizeof(t1),1,fp);
printf(“\n请输入名称:”);
scanf(“%c”和&t1.name);
fflush(stdin);
printf(“\n请输入年龄:”);
scanf(“%d”和t1.年龄);
fflush(stdin);
printf(“\n请输入地址:”);
scanf(“%s”和t1.地址);
fflush(stdin);
printf(“\N确认?(是/否):”;
scanf(“%c”,选择(&c));
如果(选项=='y'|选项=='y')
{
fp=fopen(fname,“a+”);
fwrite(&t1,sizeof(t1),1,fp);
fclose(fp);
fflush(stdin);
系统(“cls”);
印刷();
}
else if(choice='n'| choice='n')
{
fflush(stdin);
系统(“cls”);
印刷();
}
其他的
fflush(stdin);
系统(“cls”);
printf(“请再试一次!”);
系统(“暂停”);
}
您的程序打印“奇怪的符号”,因为
t1
从未在
打印
功能中初始化

在这里,您从未从文件中读取:

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*
,但
地址
表示
char
。因此,您必须使用
%c
。这同样适用于
地址的
scanf

也许你真的想要
struct text
来保存字符串!?如果是这样,您应该使用
字符数组
。目前,结构只能保存字符(即名称和地址的单个字母)。也许你真的想做:

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

};
然后对
printf
scanf
使用
%s
而不是
%c

这里还有一些“奇怪”的代码:


除此之外,您的代码缺少对返回值的所有检查。始终检查由
fopen
fread
fwrite
scanf

返回的值,因此
scanf(“%c”、&t1.name)
将输入从name分配到
t1.name
scanf(“%d”、&t1.age)
将输入从age分配到
t1.age
?@sugar,但是请注意,
%c
是一个字符,因此名称只是一个字母。要从输入中读取一个单词,我使用
%s
,即使我的值保存为
%c
?@sugar-嗯。。。。要读取“单词”(又名字符串),请使用
%s
,但首先必须确保使用的变量可以容纳字符串!当变量为
char
类型时,请勿使用
%s
。您可能想更改结构。如
字符名[100]而不是
字符名。这样做之后,出于某种原因,您可以使用
%s
,初学者教程总是从需要通过scanf与用户进行交互式对话的示例开始。scanf使用起来有点棘手,而且它的棘手之处并不明显。C中的“char”类型是一个字符,在完成这段代码之前,您应该了解char数组如何工作/指针,以及“&”在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);