标题:把数组元素读进文件里,为啥文件里是空的呢
取消只看楼主
小晓鸭呀
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2020-4-4
结帖率:40%
已结贴  问题点数:15 回复次数:3 
把数组元素读进文件里,为啥文件里是空的呢
void BaoCun(int count)
{
    FILE *fp;
    fp = fopen("qizi", "wb");
    fwrite(&Zuobiao[count - 1], sizeof(Zuobiao), 1, fp);
    fclose(fp);
}
想用这个函数把结构体数组里的数读进文件里,为啥文件里是空的呢?
struct zuobiao
{
    int x[400];
    int y[400];
} Zuobiao[400];结构体是这样的
搜索更多相关主题的帖子: 数组 文件 元素 int 结构体 
2020-06-17 00:04
小晓鸭呀
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2020-4-4
得分:0 
回复 2楼 rjsp
返回值是1,文件大小是0,这是怎么回事
2020-06-17 10:03
小晓鸭呀
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2020-4-4
得分:0 
回复 5楼 rjsp
文件删除了,会重新生成,下面是我的代码,我写了注释,我也不知道咋整,可以帮我看一下吗,谢谢您
我是想用循环逐个读入坐标,之后再用另外一个函数读出来

#include <stdlib.h>
#include <stdio.h>

//●○

int qipan[20][20] = {0};
void menu();
void InitQiPan();            //初始化棋盘
void XiaQi(int count);     //获取坐标数据,并判断该坐标是否已经有子
//void BaoCun(int count);      //将坐标数据保存到文件中
void PrintfQiPan(int count);

//打印游戏菜单
void menu()
{
    int op;//此变量为菜单选项
    //打印菜单
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    printf("~           *简易五子棋游戏菜单*              ~\n");
    printf("~           *    0.进入游戏    *              ~\n");
    printf("~           *    1.退出游戏    *              ~\n");
    printf("~           *    2.帮助        *              ~\n");
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    scanf("%d", &op);//输入选项
    switch(op)
    {
    case 1://输入1时结束
    {
        exit(0);
    }
    case 2://输入2时,系统给出“帮助”
    {
        printf("帮助:\n五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。\n"
               "本游戏中,黑子先落,白子在其后,根据行、列坐标,下在棋盘交叉点处。\n先形成五子连线者获胜!\n");
        break;
    }
    case 0:
    {
        return ;//输入0时,返回主函数,进行后续操作
    }
    default:
    {
        printf("选项错误!请重新作出你的选择。。。。\n");  //当输入的数字没有时,系统会发出提示,再选一次
        getchar();//若玩家输入字符时,可用getchar()将其读走
        menu();//重新返回菜单
    }
    }
}

struct zuobiao
{
    int x[400];
    int y[400];
} Zuobiao[400];

//初始化一个棋盘,让界面只打印出一个棋盘
void InitQiPan()
{
    int i, j;//i,j均为坐标
    for(i = 1; i <= 20; i++)
    {
        printf("%d ", i % 10);  //打印列坐标
    }
    printf("\n");
    for(i = 1; i <= 20; i++)
    {
        for(j = 1; j <= 20; j++)
        {
            printf("·"); //打印棋盘
        }
        printf(" %d", i);//打印棋盘行坐标
        printf("\n");
    }
}

void XiaQi(int count)
{
    int i, j, k;
again:
    ;
    printf("请输入棋子坐标,如2,3...:");
    scanf("%d,%d", &i, &j);   //输入坐标
    while(i < 1 || i > 20 || j < 1|| j > 20)
    {
        printf("坐标格式错误!!!请重新输入棋子坐标,如2,3...:");
        fflush(stdin);  //清除缓冲区
        scanf("%d,%d", &i, &j);//重新输入坐标
    }
    for(k = 1; k <= count; k++)
    {
        if(Zuobiao[k].x[k] == i && Zuobiao[k].y[k] == j)
        {
            printf("此坐标上已有棋子!!请重新输入:");
            goto again;
        }
    }
    /*
    Zuobiao[count].x[count] = i;
    Zuobiao[count].y[count] = j;
    if(count % 2 == 1)
    {
        qipan[i][j] = 1;
    }
    if(count % 2 == 0)
    {
        qipan[i][j] = 2;
    }
    */
}

void BaoCun(int count)//用循环保存坐标
{
    FILE *fp;
    fp = fopen("C:\\CB\\game1\\qizi", "wb");
    fwrite(&Zuobiao[count - 1], sizeof(struct zuobiao), 1, fp);
    //fclose(fp);
}

void PrintfQiPan(int count)
{
    int i, j, k;
    for(i = 1; i < 21; i++)
    {
        printf("%d ", i);
    }
    printf("\n");
    for(i = 1; i <= 20; i++)
    {
        for(j = 1; j <= 20; j++)
        {
            for(k = 1; k <= count; k++)//这个循环是把count个棋子打印在棋盘上
            {
                if(Zuobiao[k].x[k] == i && Zuobiao[k].y[k] == j)
                {
                    if( qipan[i][j] == 1)
                    {
                        printf("●");
                        break;
                    }
                    else if( qipan[i][j] == 2)
                    {
                        printf("○");
                        break;
                    }
                }
            }
            if(k <= count)//中途找到棋子返回
            {
                continue;
            }
            else//没找到对应(i,j)上有棋子
            {
                printf("·");//在该位置上打印一个焦点
            }
        }
        printf(" %d\n", i);//打印行坐标
    }
}

int main()
{
    int m;
    menu();
    InitQiPan();
    for(m = 1; m < 400; m++)
    {
        XiaQi(m);
        BaoCun(m);
        PrintfQiPan(m);
    }

    return 0;
}
2020-06-17 11:45
小晓鸭呀
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2020-4-4
得分:0 
回复 7楼 rjsp
void BaoCun(int count)//用循环保存坐标
{
    FILE *fp;
    fp = fopen("C:\\CB\\game1\\qizi", "a+");
    fwrite(&Zuobiao[count - 1], sizeof(struct zuobiao), 1, fp);
    fclose(fp);
}


我改成了这个,文件大小也在不断增加,但是打开文件里面是小框框
下面我加了一个读文件的函数,打印不出来棋子,
为什么读不到数据呢


void PrintfQiPan(int count)
{
    int i, j, k;
    FILE *fp;
    fp = fopen("C:\\CB\\game1\\qizi","rb");
    for(i = 1; i < 21; i++)
    {
        printf("%d ", i);
    }
    printf("\n");
    for(i = 1; i <= 20; i++)
    {
        for(j = 1; j <= 20; j++)
        {
            for(k = 1; k <= count; k++)//这个循环是把count个棋子打印在棋盘上
            {
                fread(&Zuobiao[k], sizeof(struct zuobiao), 1, fp);
                if(Zuobiao[k].x[k] == i && Zuobiao[k].y[k] == j)
                {
                    if( qipan[i][j] == 1)
                    {
                        printf("●");
                        break;
                    }
                    else if( qipan[i][j] == 2)
                    {
                        printf("○");
                        break;
                    }
                }
            }
            if(k <= count)//中途找到棋子返回
            {
                continue;
            }
            else//没找到对应(i,j)上有棋子
            {
                printf("·");//在该位置上打印一个焦点
            }
        }
        printf(" %d\n", i);//打印行坐标
    }
}


[此贴子已经被作者于2020-6-17 14:08编辑过]

2020-06-17 13:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502153-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.275980 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved