鱼C论坛

 找回密码
 立即注册
查看: 3727|回复: 6

[技术交流] 向一个文件连续写入多个结构体变量

[复制链接]
发表于 2011-11-6 15:19:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
判断结构体是否为空,确保不覆盖原来的数据,请大家帮帮忙调试以下,为什么总是一个结果

#include<stdio.h>
#include<stdlib.h>
struct data
{
        char account[20];
        char code[20];
}person[3];
void main()
{
        struct data *p;   //结构体指针
        char ch;           / /用来判断是否要储存以下输入的数据
        int i=0;             //控制循环,不能超过结构体变量的总数
        FILE *fp;              //文件指针,指向要写入的文件
        if((fp=fopen("data","wb"))==NULL)   //为什么新建的文件也不是为空的
        {
                printf("this file can not open!");
                exit(0);
        }
        p=person;
        for(i=0;i<3;i++)
        {
                if(p!=NULL)//直到找到空结构体变量,用来写入新数据。
                        p=p++;
                while(!p)
                {
                        printf("请输入账号:");
                        gets(p->account);
                        printf("请设置密码:");
                        gets(p->code);
                        printf("按任意键保存账号!按'n'取消!");
                        scanf("%c",&ch);
                        if(ch=='n')
                                printf("取消成功!\n");
                        else
                        {
                                fseek(fp,long(i*sizeof(struct data)),0);
                                fwrite(p,sizeof(struct data),1,fp);
                                printf("保存成功!\n");
                                i++;p++;
                        }
                        printf("是否继续创建账号?任意键继续,按'n'结束!");
                        getchar();
                        if(getchar()=='n')
                                break;
                }
        }
        if(i>=3)  //如果所有结构体变量都一有数据,结束!
                printf("此文件夹已有文件!");
        fclose(fp);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-6 16:33:21 | 显示全部楼层
        p=person;
        for(i=0;i<3;i++)
        {
                if(p!=NULL)//直到找到空结构体变量,用来写入新数据。
                        p=p++;

你这个判断有什么意义吗?这个p根本就不可能==NULL
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-6 16:39:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-6 20:54:26 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
struct data 
{
        char account[20];
        char code[20];
}person[3];
void main()
{
        struct data *p;   //结构体指针
        char ch;           //用来判断是否要储存以下输入的数据
        int i=0;             //控制循环,不能超过结构体变量的总数
        FILE *fp;              //文件指针,指向要写入的文件
        if((fp=fopen("data","wb"))==NULL)   //为什么新建的文件也不是为空的
        {
                printf("this file can not open!");
                exit(0);
        }
        p=person;
        for(i=0;i<3;i++)
        {
                printf("请输入账号:");
                gets(p->account);
                printf("请设置密码:");
                gets(p->code);
                printf("按任意键保存账号!按'n'取消!");
                scanf("%c",&ch);
                if(ch=='n')
                        printf("取消成功!\n");
                else
                {
                        fseek(fp,
                                (long)(i*sizeof(struct data)),0);
                        fwrite(p,sizeof(struct data),1,fp);
                        printf("保存成功!\n");
                        i++;p++;
                }
                printf("是否继续创建账号?任意键继续,按'n'结束!");
                getchar();
                if(getchar()=='n')
                        break;
        }
        if(i>=3)  //如果所有结构体变量都一有数据,结束!
                printf("此文件夹已有文件!");
        fclose(fp);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-7 23:48:16 | 显示全部楼层
对我来说太深奥了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-13 19:28:59 | 显示全部楼层
你的那个for循环有什么用啊,
你while里面的i每次都加1,等到了for又加1,逻辑上应该过不去了吧!!
值要一个while应该就行了吧!!!

               if (i>=3)  //如果所有结构体变量都一有数据,结束!

               printf("此文件夹已有文件!");
这个应该放在while里面进行判断吧,总不能等用户输入完了, 你才告诉他,文件已经满了吧!!
如过已经输入了8个了,最后以看文件满了,他不晕死啊!!呵呵
我也是初学者,一起努力啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-13 20:13:35 | 显示全部楼层
# include <stdio.h>

struct student 

{
    char accounts[20];
    char password[20];

}person[3];

void print (void);

void main()

{
    FILE *fp;
    int i = 0;

    if (! (fp = (fopen ("1", "wb"))))  //判断文件是否打开成功;
    {
        printf("文件打开失败!!\n");
        return ;
    }
    
    while (1)
    {
        printf("请输入帐号:");   
        scanf("%s", &person[i].accounts);
        rewind(stdin);              //清空缓冲区!!

        printf("请输入密码:");
        scanf("%s", &person[i].password);
        rewind(stdin);              //同上!!

        printf("保存按下任意键,取消按n!");
        

        if (getchar() == 'n')
        {
            printf("\n");
            printf("取消成功!!\n");
        }

        else
        {
            printf("\n");
            printf("保存成功!!\n");

          //fseek(fp, sizeof(struct student), 0);   //如果这句加了,每次都把
                                                    //文本指针指向了第一个,
                                                    //则第二次输入的数据会覆盖第一次!!
            fwrite(&person[i], sizeof(struct student), 1, fp);
            i++;
        }

        if (i >= 3)
        {
            printf("文件已满无法存储!!\n");
            break;
        }
    }

    fclose (fp);
    print();
}

void print (void)          //读取刚刚写入的文件,打印到屏幕!!

{
    FILE *fp;
    int i;

    if(!(fp = fopen("1", "rb")))
    {
        printf("cannot open a file!");
        return ;
    }


    for(i = 0; i < 3; i++)
    {
        fread(&person[i], sizeof(struct student), 1, fp);      //读去文件内容到person结构体数组;

        printf("帐号:%s\n密码:%s\n", person[i].accounts, person[i].password);  //打印!!
    }

}
我也是才学文件的!!有问题一起发掘啊!!!{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 11:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表