鱼C论坛

 找回密码
 立即注册
查看: 1988|回复: 0

[技术交流] 字符列阵,一个有趣的程序,欢迎大家玩!想怎么玩就怎么玩

[复制链接]
发表于 2016-9-7 21:52:43 | 显示全部楼层 |阅读模式

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

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

x

入门级菜鸟一枚,发个有趣的小程序,欢迎新手学习大神指点


/*
*******************************************************
时间:2016年9月4日22:38:38
目的:
        创建一个20*30的整数文件0-9之间空格分开,将文件读入一个int二位数组中,初始化为字符阵列。比如0代表空格,1代表句号
        规则就是较大值占用空间较多的字符来表示。并将结果存在一个文件中。
总结:
        1)处理细节要注意一不注意就会导致出现错误,temp -=48 字符转换成数值放在判断外导致数组写入错误数值,出现乱码;
        2)fgetc函数遇到文件结尾返回EOF,fgets遇到文件结尾返回NULL
未解决:
        1)用fscanf函数读取整数会出现错误。
        2)字符阵列最后一行出现乱码;分析:超出原数组大小,并多获取一行数据原因可能是调用feof函数进行循环判断多进行了一次。
        此问题已解决,实际为fchars_removec未能对文件结尾进行正确判断。原来使用
        ((buf[i] = fgetc(fp)) != '\n' && i<100)进行判断使用逻辑与导致文件结束还会进行读取,改为buf[i] != EOF
        就能正确判断文件是否结束。
*******************************************************
*/
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define LINE 20
#define ROW 30

void arry_rand(int arry[LINE][ROW]);
int arry_file(int arry[LINE][ROW], FILE *fp);
int fchars_removec(FILE * fp, char ch, char *buf);
int write_file(char *buf, FILE *fpg);

int main()
{
        int arry[LINE][ROW];
        FILE *fps, *fpg;
        char fns[ROW], fng[ROW];
        char ch = ' ',ch1='\n';
        char buf[2 * ROW];
        char chrindex[11] = { " | - + L #" };  //字符列阵转换索引字符

        printf("请输入随机数据文件名和字符阵列存储文件名(全路径,存在文件会被清零,不存在文件会创建):");
        scanf("%s %s", fns, fng);

        if (NULL == (fps = fopen(fns, "w+")))
                printf("打开%s文件失败!\n", fns);
        if (NULL == (fpg = fopen(fng, "w+")))
                printf("打开%s文件失败!\n", fng);
        arry_rand(arry);
        arry_file(arry, fps);

        fflush(fps);                //刷新文件
        rewind(fps);                //文件指针指向开始
       
        while (!feof(fps))
        {
                fchars_removec(fps, ' ', buf);
                chs_index(buf, chrindex);
                write_file(buf, fpg);
        }
        fclose(fps);
        fclose(fpg);
}

void arry_rand(int arry[LINE][ROW])
{
        time_t t;
        int i, j;
        srand((unsigned)time(&t));  //初始化随机数种子
        for (i = 0; i < LINE; i++)
                for (j = 0; j < ROW; j++)
                        arry[i][j] = rand() % 10;  //数组初始化
}


/* 功能:提取二维数字值到文件中追加空格进行分割数字,成功返回0,否则非零*/
int arry_file(int arry[LINE][ROW], FILE * fp)
{
        int i, j;
        char ch = ' ', ch1 = '\n';
        for (i = 0; i < LINE; i++)
        {
                for (j = 0; j < ROW; j++)
                        fprintf(fp, "%d%c", arry[i][j], ch);                //文件写入
                fprintf(fp, "%c", ch1);
               
        }
        if (LINE == i && j == ROW)
                        return 0;
                return 1;
}

/*        功能:从文件中获取一行字符串,并消除字符串中的指定字符,返回消除后字符数量包括空字符
        参数:fp文件指针,ch需要消除的字符,buf缓存消除后的字符串。
*/
        int fchars_removec(FILE * fp, char ch, char * buf)
{
                int i = 0;
        while ((buf[i] = fgetc(fp)) != '\n' && buf[i] != EOF)
        {
                if (buf[i] != ch)
                        i++;
        }
        buf[i] = '\0';
                return i;
}

        /*功能:把buf字符串的字符转换为数组索引值,并把buf缓存中的字符替换为一行转换后的字符列阵
          参数:buf必须为一行索引字符,index参数为转换字符列阵的所引数组,返回转换个数*/
        int chs_index(char * buf, char *index)
        {
                int i=0;
                while (buf[i] != '\0')
                {
                        buf[i] = index[buf[i] - 0x30];
                        i++;
                }
                return i - 1;
        }
        /*对一行字符串写入文件,buf字符串缓存,fpg字符阵列文件指针*/
        int write_file(char *buf, FILE *fpg)
        {
                char ch = '\n';
                fprintf(fpg, "%s%c", buf, ch);
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-27 11:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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