首页 文章

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

提问于
浏览
1

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

但是,我遇到了几个问题 .


Problems

确认输入后

  • 程序停止工作 .

  • 当它应该打印输入时,它会打印出奇怪的符号 .


Questions

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

For ex : - 当我输入“John Lemon " for when it asks for " Name:”时 .

我可以打印“John Lemon " instead of " John” .

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

For ex

Sample Output

姓名:John Lemon

年龄:21岁

地址:Apple Street街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");
}

1 回答

  • 2

    您的程序打印"weird symbols"因为 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*addresschar . 所以你必须使用 %c . 这同样适用于 addressscanf .

    也许你真的想要 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);
    

    除此之外,您的代码缺少对返回值的所有检查 . 始终检查 fopenfreadfwritescanf 返回的值 .

相关问题