|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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);
} |
|