鱼C论坛

 找回密码
 立即注册
查看: 3597|回复: 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 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct data
  4. {
  5.         char account[20];
  6.         char code[20];
  7. }person[3];
  8. void main()
  9. {
  10.         struct data *p;   //结构体指针
  11.         char ch;           //用来判断是否要储存以下输入的数据
  12.         int i=0;             //控制循环,不能超过结构体变量的总数
  13.         FILE *fp;              //文件指针,指向要写入的文件
  14.         if((fp=fopen("data","wb"))==NULL)   //为什么新建的文件也不是为空的
  15.         {
  16.                 printf("this file can not open!");
  17.                 exit(0);
  18.         }
  19.         p=person;
  20.         for(i=0;i<3;i++)
  21.         {
  22.                 printf("请输入账号:");
  23.                 gets(p->account);
  24.                 printf("请设置密码:");
  25.                 gets(p->code);
  26.                 printf("按任意键保存账号!按'n'取消!");
  27.                 scanf("%c",&ch);
  28.                 if(ch=='n')
  29.                         printf("取消成功!\n");
  30.                 else
  31.                 {
  32.                         fseek(fp,
  33.                                 (long)(i*sizeof(struct data)),0);
  34.                         fwrite(p,sizeof(struct data),1,fp);
  35.                         printf("保存成功!\n");
  36.                         i++;p++;
  37.                 }
  38.                 printf("是否继续创建账号?任意键继续,按'n'结束!");
  39.                 getchar();
  40.                 if(getchar()=='n')
  41.                         break;
  42.         }
  43.         if(i>=3)  //如果所有结构体变量都一有数据,结束!
  44.                 printf("此文件夹已有文件!");
  45.         fclose(fp);
  46. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. # include <stdio.h>

  2. struct student

  3. {
  4.     char accounts[20];
  5.     char password[20];

  6. }person[3];

  7. void print (void);

  8. void main()

  9. {
  10.     FILE *fp;
  11.     int i = 0;

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

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

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

  28.         if (getchar() == 'n')
  29.         {
  30.             printf("\n");
  31.             printf("取消成功!!\n");
  32.         }

  33.         else
  34.         {
  35.             printf("\n");
  36.             printf("保存成功!!\n");

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

  43.         if (i >= 3)
  44.         {
  45.             printf("文件已满无法存储!!\n");
  46.             break;
  47.         }
  48.     }

  49.     fclose (fp);
  50.     print();
  51. }

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

  53. {
  54.     FILE *fp;
  55.     int i;

  56.     if(!(fp = fopen("1", "rb")))
  57.     {
  58.         printf("cannot open a file!");
  59.         return ;
  60.     }


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

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

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

本版积分规则

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

GMT+8, 2024-4-26 17:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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