//本博主所写的代码仅为阅读者提供参考;
//若有不足之处请提出,博主会尽所能修改;
//附上课后编程练习题目;
//若是对您有用的话请点赞或分享提供给它人;
//附上12题的文本文件;
/*
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 5 2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 1 9 8 5 4 5 2 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 0 4 5 2 0 0 0 0 0 0 0 0
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 4 5 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 1 8 5 0 0 0 4 5 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 4 5 2 0 0 0 0 0
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
9 9 9 9 0 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 3 9 9 9 9 9 9 9
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 2 2 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 3 3 0 0 0 0 0 0 5 8 9 9 8 5 0 5 6 1 1 1 1 6 5 0 0 0
0 0 0 0 4 4 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 5 5 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
*/
//13.10 - 4.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
double n;
double sum = 0.0;
int ct = 0;
if (argc == 1)
{
fp = stdin;
}
else if (argc == 2)
{
if ((fp = fopen(argv[1], "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[1]);
exit(EXIT_FAILURE);
}
}
else
{
fprintf(stderr, "本程序名是:%s.\n", argv[0]);
exit(EXIT_FAILURE);
}
if (fp == stdin)
{
printf("请您输入一些数字(按q退出):\n");
}
while (!feof(fp) && fscanf(fp, "%lf", &n) == 1)
{
/*↑feof函数当上一次输入调用检测到
文件结尾时返回非0值,否则返回0;*/
ct++;
sum += n;
}
if (ct > 0)
{
printf("%d个数的算术平均值是%g.\n", ct, sum / ct);
}
else
{
printf("无数字!无法计算算术平均值!\n");
}
return 0;
}
//-------------
//13.10 - 5.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 256
int has_ch(char ch, const char *line);
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
char line[LEN];
if (argc != 3)
{
fprintf(stderr, "本程序名是:%s.\n", argv[0]);
exit(EXIT_FAILURE);
}
else
{
if (strlen(argv[1]) != 1)
{
fprintf(stderr, "第二个命令行参数必须是1个字符!\n");
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[2], "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[2]);
exit(EXIT_FAILURE);
}
}
ch = argv[1][0];
printf("打印含指定字符%c的行是:\n", ch);
while (fgets(line, LEN, fp) != NULL)
{
if (has_ch(ch, line))
{
fputs(line, stdout);
}
}
if (fclose(fp) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
}
return 0;
}
int has_ch(char ch, const char *line)
{
while (*line)
{
if (ch == *line)
{
return 1;
}
line++;
}
return 0;
}
//-------------
//13.11 - 1.c
#include <stdio.h>
#include <stdlib.h>
#define LEN 50
int main(int argc, char *argv[])
{
int ch;
FILE *fp;
unsigned long count = 0;
char filename[LEN];
printf("Please enter a filename:\n");
scanf("%49s", filename);
if ((fp = fopen(filename, "r")) == NULL)
{
printf("Can't open %s\n", filename);
exit(EXIT_FAILURE);
}
while ((ch = getc(fp)) != EOF)
{
putc(ch, stdout);
count++;
}
fclose(fp);
printf("File %s has %lu characters\n", filename, count);
return 0;
}
//-------------
//13.11 - 2.c
#include <stdio.h>
#include <stdlib.h>
#define BUF 512
int main(int argc, char *argv[])
{
size_t bytes;
FILE *source;
FILE *target;
char temp[BUF];
if (argc != 3)
{
fprintf(stderr, "本程序名是:%s.\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((source = fopen(argv[1], "rb")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[1]);
exit(EXIT_FAILURE);
}
if ((target = fopen(argv[2], "wb")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[2]);
exit(EXIT_FAILURE);
}
while ((bytes = fread(temp, sizeof(char), BUF, source)) > 0)
{
fwrite(temp, sizeof(char), bytes, target);
}
if (fclose(source) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[1]);
}
if (fclose(target) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
}
return 0;
}
//-------------
//13.11 - 3.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define LEN 50
int main(int argc, char *argv[])
{
int ch;
FILE *fp;
char filename[LEN];
printf("请您输入一个文件名:\n");
scanf("%49s", filename);
if ((fp = fopen(filename, "r+")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", filename);
exit(EXIT_FAILURE);
}
while ((ch = getc(fp)) != EOF)
{
fseek(fp, -1L, SEEK_CUR); //回退一个字节;
putc(toupper(ch), fp);
fseek(fp, 0L, SEEK_CUR); //改变文件状态,使得下一个字符可以被正常读取;
}
rewind(fp);
printf("%s文件中的所有字符已被转换为大写:\n", filename);
while ((ch = getc(fp)) != EOF)
{
putchar(ch);
/*↑显示到屏幕上检测
字符是否成功转换为大写;*/
}
putchar('\n');
if (fclose(fp) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", filename);
}
return 0;
}
//-------------
//13.11 - 4.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i, temp;
FILE *source;
if (argc == 1)
{
fprintf(stderr, "本程序名是:%s.\n", argv[0]);
exit(EXIT_FAILURE);
}
for (i = 1; i < argc; i++)
{
if ((source = fopen(argv[i], "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[i]);
continue;
}
while ((temp = getc(source)) != EOF)
{
putchar(temp);
}
putchar('\n');
if (fclose(source) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[i]);
}
}
return 0;
}
//-------------
//13.11 - 5.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 4096
#define SLEN 81
void append(FILE *source, FILE *dest);
int main(int argc, char *argv[])
{
int i, ch;
int files = 0;
FILE *fa;
FILE *fs;
if (argc < 3)
{
printf("Usage: %s appendfile sourcefile.\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((fa = fopen(argv[1], "a+")) == NULL)
{
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
if (setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0)
{
//↑设置缓冲区大小为BUFSIZE;
//↑_IOFBF表示完全缓冲;
//↑NULL表示为fa指向的文件分配缓冲区;
fputs("Can't create output buffer\n", stderr);
exit(EXIT_FAILURE);
}
for (i = 2; i < argc; i++)
{
if (strcmp(argv[i], argv[1]) == 0)
{
fputs("Can't append file to itself\n", stderr);
//↑防止文件自身附加在文件末尾;
}
else if ((fs = fopen(argv[i], "r")) == NULL)
{
fprintf(stderr, "Can't open %s\n", argv[i]);
}
else
{
if (setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)
{
//↑同上一个setvbuf函数所述;
//↑本次调用是为fs指向的文件分配缓冲区;
fputs("Can't create input buffer\n", stderr);
continue;
}
append(fs, fa);
if (ferror(fs) != 0)
{
/*↑当读或写出现错误
ferror函数返回一个非0值*/
fprintf(stderr, "Error in reading file %s.\n", argv[i]);
}
if (ferror(fa) != 0)
{
fprintf(stderr, "Error in writing file %s.\n", argv[1]);
}
fclose(fs);
files++;
printf("File %s appended.\n", argv[i]);
}
}
printf("Done appending. %d files appended.\n", files);
rewind(fa); //返回文件起始处;
printf("%s contents:\n", argv[1]);
while ((ch = getc(fa)) != EOF)
{
putchar(ch);
}
putchar('\n');
puts("Done displaying.");
fclose(fa);
return 0;
}
void append(FILE *source, FILE *dest)
{
size_t bytes;
static char temp[BUFSIZE];
//↑静态无链接变量只分配一次内存;
while ((bytes = fread(temp, sizeof(char), BUFSIZE, source)) > 0)
{
/*↑fread函数把source指向的
文件中的BUFSIZE块char类型的
数据写入temp数组中,返回值是成功
读取数据块的数量;*/
fwrite(temp, sizeof(char), bytes, dest);
/*↑fwrite函数把temp数组中的
bytes块char类型的数据写入dest
指向的文件中,返回值是成功写入数据
块的数量;*/
}
return;
}
//-------------
//13.11 - 6.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 40
int main(int argc, char *argv[])
{
FILE *in, *out;
int ch;
char name[LEN];
int count = 0;
char temp[LEN];
printf("Please enter a filename:\n");
scanf("%39s", temp);
if ((in = fopen(temp, "r")) == NULL)
{
fprintf(stderr, "I could't open the file \"%s\"\n", temp);
exit(EXIT_FAILURE);
}
//↓拷贝文件名;
strncpy(name, temp, LEN - 5);
name[LEN - 5] = '\0';
strcat(name, ".red");
//↑在文件名后面添加.red;
if ((out = fopen(name, "w")) == NULL)
{
fprintf(stderr, "Can't create output file.\n");
exit(3);
}
//↓拷贝数据;
while ((ch = getc(in)) != EOF)
{
if (count++ % 3 == 0)
{
putc(ch, out);
}
}
if (fclose(in) != 0 || fclose(out) != 0)
{
fprintf(stderr, "Error in closing files\n");
}
return 0;
}
//-------------
//13.11 - 7(a).c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
FILE *ft;
int i, j, ch, ct;
i = j = 1;
if (argc != 3)
{
fprintf(stderr, "本程序名是:%s.\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[1], "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[1]);
exit(EXIT_FAILURE);
}
if ((ft = fopen(argv[2], "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[2]);
exit(EXIT_FAILURE);
}
ch = getc(fp); //←读取第一个文件的第一个字符;
ct = getc(ft); //←读取第二个文件的第一个字符;
while ((ch != EOF) || (ct != EOF))
{
if (ch != EOF)
{
printf("打印第1个文件第%d行:\n", i++);
}
while ((ch != EOF) && (ch != '\n'))
{
putchar(ch);
ch = getc(fp);
//↑读取第一个文件下一个字符;
}
if (ch != EOF)
{
//↓若读取到换行符时执行此块语句;
putchar('\n');
ch = getc(fp);
}
if (ct != EOF)
{
printf("打印第2个文件第%d行:\n", j++);
}
while ((ct != EOF) && (ct != '\n'))
{
putchar(ct);
ct = getc(ft);
//↑读取第二个文件下一个字符;
}
if (ct != EOF)
{
//↓若读取到换行符时执行此块语句;
putchar('\n');
ct = getc(ft);
}
}
if (fclose(fp) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[1]);
}
if (fclose(ft) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
}
return 0;
}
//-------------
//13.11 - 7(b).c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
FILE *ft;
int ch, ct, count;
count = 1;
if (argc != 3)
{
fprintf(stderr, "本程序名是:%s.\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[1], "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[1]);
exit(EXIT_FAILURE);
}
if ((ft = fopen(argv[2], "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[2]);
exit(EXIT_FAILURE);
}
ch = getc(fp);
ct = getc(ft);
while ((ch != EOF) || (ct != EOF))
{
printf("打印2文件第%d行:\n", count++);
while ((ch != EOF) && (ch != '\n'))
{
putchar(ch);
ch = getc(fp);
}
if (ch != EOF)
{
if (ct == EOF)
{
//↑若遇到第二个文件EOF则换行;
putchar('\n');
}
else
{
putchar(' ');
//↑打印空格隔开2个文件内容;
}
ch = getc(fp);
}
while ((ct != EOF) && (ct != '\n'))
{
putchar(ct);
ct = getc(ft);
}
if (ct != EOF)
{
putchar('\n');
ct = getc(ft);
}
}
if (fclose(fp) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[1]);
}
if (fclose(ft) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
}
return 0;
}
//-------------
//13.11 - 8.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int search(int ch, FILE *fp);
int main(int argc, char *argv[])
{
FILE *fp;
int i, ch, ct;
int count = 0;
if (argc < 2)
{
fprintf(stderr, "本程序名是:%s.\n", argv[0]);
exit(EXIT_FAILURE);
}
if (strlen(argv[1]) != 1)
{
fprintf(stderr, "第二个命令行参数必须是一个字符!\n");
exit(EXIT_FAILURE);
}
if (argc == 2)
{
fp = stdin;
ch = argv[1][0];
printf("请您输入字符串(遇EOF退出):\n");
count = search(ch, fp);
printf("字符%c总共出现了%d次.\n", ch, count);
}
else if (argc > 2)
{
ch = argv[1][0];
for (i = 2; i < argc; i++)
{
if ((fp = fopen(argv[i], "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[i]);
continue;
}
printf("%s文件中的内容是:\n", argv[i]);
while ((ct = getc(fp)) != EOF)
{
putchar(ct);
}
rewind(fp);
count = search(ch, fp);
printf("字符%c在%s文件中总共出现了%d次.\n", ch, argv[i], count);
if (fclose(fp) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[i]);
}
}
}
return 0;
}
int search(int ch, FILE *fp)
{
int find;
int n = 0;
while ((find = getc(fp)) != EOF)
{
if (ch == find)
{
n++;
}
}
return n;
}
//-------------
//13.11 - 9.c
#include <stdio.h>
#include <stdlib.h>
#define MAX 41
int main(void)
{
FILE *fp;
int ct = 0;
char words[MAX];
if ((fp = fopen("wordy", "a+")) == NULL)
{
fprintf(stdout, "Can't open \"wordy\" file.\n");
exit(EXIT_FAILURE);
}
while (fgets(words, MAX, fp) != NULL)
{
ct++;
}
rewind(fp);
puts("Enter words to add to the file; press the #");
puts("key at the beginning of a line to terminate.");
while ((fscanf(stdin, "%40s", words) == 1) && (words[0] != '#'))
{
fprintf(fp, "%-3d:%s\n", ++ct, words);
}
puts("File contents:");
rewind(fp);
while (fgets(words, MAX, fp) != NULL)
{
fputs(words, stdout);
}
puts("Done!");
if (fclose(fp) != 0)
{
fprintf(stderr, "Error in closing file\n");
}
return 0;
}
//-------------
//13.11 - 10.c
#include <stdio.h>
#include <stdlib.h>
#define LEN 50
int main(int argc, char *argv[])
{
int ch;
FILE *fp;
long int number;
char filename[LEN];
printf("请您输入一个文件名:\n");
scanf("%49s", filename);
if ((fp = fopen(filename, "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", filename);
exit(EXIT_FAILURE);
}
printf("请输入一个文件位置(<0或q退出):");
while ((scanf("%ld", &number) == 1) && (number >= 0))
{
fseek(fp, number, SEEK_SET);
while (((ch = getc(fp)) != '\n') && (ch != EOF))
{
/*↓打印从该位置开始到
下一个换行符之前的内容;*/
putchar(ch);
}
if (ch == EOF)
{
printf("此位置已遇到EOF!\n");
break;
}
printf("\n您可以再次输入一个文件位置(<0或q退出):");
}
printf("本程序完成!\n");
if (fclose(fp) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", filename);
}
return 0;
}
//-------------
//13.11 - 11.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 256
int main(int argc, char *argv[])
{
FILE *fp;
char temp[LEN];
if (argc != 3)
{
fprintf(stderr, "本程序名是:%s.\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[2], "r")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", argv[2]);
exit(EXIT_FAILURE);
}
printf("打印%s文件中包含%s字符串的所有行:\n", argv[2], argv[1]);
while (fgets(temp, LEN, fp) != NULL)
{
if (strstr(temp, argv[1]) != NULL)
{
//↑查找右参数子串是否在左参数中;
fputs(temp, stdout);
}
}
putchar('\n');
if (fclose(fp) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", argv[2]);
}
return 0;
}
//-------------
//13.11 - 12.c
#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
#define LEN 50
void change(int (*a)[COLS], char (*b)[COLS], int rows);
const char trans[LEVELS + 1] = " .':~*=&%#"; //存储需要转换的字符;
int main(void)
{
int row, col;
FILE *infile;
char filename[LEN];
int figure[ROWS][COLS];
char picture[ROWS][COLS];
printf("请输入一个文件名:\n");
scanf("%49s", filename);
if ((infile = fopen(filename, "r+")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", filename);
exit(EXIT_FAILURE);
}
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
fscanf(infile, "%d", &figure[row][col]);
//↑从文件中读取数字;
}
}
if (ferror(infile))
{
fprintf(stderr, "进行读或写文件时出现错误!\n", filename);
exit(EXIT_FAILURE);
}
change(figure, picture, ROWS);
printf("%s文件中的数字成功转换成图片如下:\n", filename);
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
putchar(picture[row][col]);
}
putchar('\n');
}
fseek(infile, 0L, SEEK_END); //定位到文件末尾;
putc('\n', infile); //↓将结果存储到文本文件中;
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
fprintf(infile, "%c", picture[row][col]);
}
putc('\n', infile);
}
if (fclose(infile) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", filename);
}
return 0;
}
void change(int (*a)[COLS], char (*b)[COLS], int rows)
{
int row, col;
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
b[row][col] = trans[a[row][col]];
//↑进行数字对应的字符转换;
}
}
return;
}
//-------------
//13.11 - 13.c
#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
#define LEN 50
void change(int rows, int cols, int a[rows][cols], char b[rows][cols]);
const char trans[LEVELS + 1] = " .':~*=&%#"; //存储需要转换的字符;
int main(void)
{
int row, col;
FILE *infile;
char filename[LEN];
int figure[ROWS][COLS];
char picture[ROWS][COLS];
printf("请输入一个文件名:\n");
scanf("%49s", filename);
if ((infile = fopen(filename, "r+")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", filename);
exit(EXIT_FAILURE);
}
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
fscanf(infile, "%d", &figure[row][col]);
//↑从文件中读取数字;
}
}
if (ferror(infile))
{
fprintf(stderr, "进行读或写文件时出现错误!\n", filename);
exit(EXIT_FAILURE);
}
change(ROWS, COLS, figure, picture);
printf("%s文件中的数字成功转换成图片如下:\n", filename);
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
putchar(picture[row][col]);
}
putchar('\n');
}
fseek(infile, 0L, SEEK_END); //定位到文件末尾;
putc('\n', infile); //↓将结果存储到文本文件中;
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
fprintf(infile, "%c", picture[row][col]);
}
putc('\n', infile);
}
if (fclose(infile) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", filename);
}
return 0;
}
void change(int rows, int cols, int a[rows][cols], char b[rows][cols])
{
int row, col;
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
b[row][col] = trans[a[row][col]];
//↑进行数字对应的字符转换;
}
}
return;
}
//-------------
//13.11 - 14.c
#include <stdio.h>
#include <stdlib.h>
#define ROWS 20
#define COLS 30
#define LEVELS 10
#define LEN 50
int clean_distortion(int (*a)[COLS], int rows, int x, int y);
void change(int (*a)[COLS], char (*b)[COLS], int rows);
const char trans[LEVELS + 1] = " .':~*=&%#"; //存储需要转换的字符;
int main(void)
{
int row, col;
FILE *infile;
char filename[LEN];
int figure[ROWS][COLS];
char picture[ROWS][COLS];
printf("请输入一个文件名:\n");
scanf("%49s", filename);
if ((infile = fopen(filename, "r+")) == NULL)
{
fprintf(stderr, "无法打开%s文件!\n", filename);
exit(EXIT_FAILURE);
}
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
fscanf(infile, "%d", &figure[row][col]);
//↑从文件中读取数字;
}
}
if (ferror(infile))
{
fprintf(stderr, "进行读或写文件时出现错误!\n", filename);
exit(EXIT_FAILURE);
}
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
figure[row][col] = clean_distortion(figure, ROWS, row, col);
}
}
change(figure, picture, ROWS);
printf("%s文件中的数字成功转换成图片如下:\n", filename);
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
putchar(picture[row][col]);
}
putchar('\n');
}
fseek(infile, 0L, SEEK_END); //定位到文件末尾;
putc('\n', infile); //↓将结果存储到文本文件中;
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
fprintf(infile, "%c", picture[row][col]);
}
putc('\n', infile);
}
if (fclose(infile) != 0)
{
fprintf(stderr, "关闭%s文件失败!\n", filename);
}
return 0;
}
int clean_distortion(int (*a)[COLS], int rows, int x, int y)
{
int average; //用于四舍五入的中间局部变量;
if (x == 0) //←矩形的上边
{
if (y == 0)
{
//↑矩形左上顶点;
if ((a[x][y] - a[x][y + 1]) > 1 && (a[x][y] - a[x + 1][y]) > 1)
{
average = ((a[x][y + 1] + a[x + 1][y]) / 2.0 + 0.5); //四舍五入公式;
return average;
}
}
if (y == COLS - 1)
{
//↑矩形右上顶点;
if ((a[x][y] - a[x][y - 1]) > 1 && (a[x][y] - a[x + 1][y]) > 1)
{
average = ((a[x][y - 1] + a[x + 1][y]) / 2.0 + 0.5);
return average;
}
}
//↓矩形的上边除了顶点之外的点;
if ((a[x][y] - a[x][y - 1]) > 1 &&
(a[x][y] - a[x][y + 1]) > 1 &&
(a[x][y] - a[x + 1][y]) > 1)
{
average = ((a[x][y - 1] + a[x][y + 1] + a[x + 1][y]) / 3.0 + 0.5);
return average;
}
}
else if (x == rows - 1) //←矩形的下边
{
if (y == 0)
{
//↑矩形左下顶点;
if ((a[x][y] - a[x - 1][y]) > 1 && (a[x][y] - a[x][y + 1]) > 1)
{
average = ((a[x - 1][y] + a[x][y + 1]) / 2.0 + 0.5);
return average;
}
}
if (y == COLS - 1)
{
//↑矩形右下顶点;
if ((a[x][y] - a[x][y - 1]) > 1 && (a[x][y] - a[x - 1][y]) > 1)
{
average = ((a[x][y - 1] + a[x - 1][y]) / 2.0 + 0.5);
return average;
}
}
//↓矩形的下边除了顶点之外的点;
if ((a[x][y] - a[x][y - 1]) > 1 &&
(a[x][y] - a[x][y + 1]) > 1 &&
(a[x][y] - a[x - 1][y]) > 1)
{
average = ((a[x][y - 1] + a[x][y + 1] + a[x - 1][y]) / 3.0 + 0.5);
return average;
}
}
if (y == 0) //←矩形的左边除了顶点之外的点;
{
if ((a[x][y] - a[x - 1][y]) > 1 &&
(a[x][y] - a[x + 1][y]) > 1 &&
(a[x][y] - a[x][y + 1]) > 1)
{
average = ((a[x - 1][y] + a[x + 1][y] + a[x][y + 1]) / 3.0 + 0.5);
return average;
}
}
else if (y == COLS - 1) //←矩形的右边除了顶点之外的点;
{
if ((a[x][y] - a[x - 1][y]) > 1 &&
(a[x][y] - a[x + 1][y]) > 1 &&
(a[x][y] - a[x][y - 1]) > 1)
{
average = ((a[x - 1][y] + a[x + 1][y] + a[x][y - 1]) / 3.0 + 0.5);
return average;
}
}
//↓矩形剩余所有的点;
if ((a[x][y] - a[x - 1][y]) > 1 &&
(a[x][y] - a[x + 1][y]) > 1 &&
(a[x][y] - a[x][y - 1]) > 1 &&
(a[x][y] - a[x][y + 1]) > 1)
{
average = ((a[x - 1][y] + a[x + 1][y] + a[x][y - 1] + a[x][y + 1]) / 4.0 + 0.5);
return average;
}
return a[x][y]; //←以上条件都不符合则返回原值;
}
void change(int (*a)[COLS], char (*b)[COLS], int rows)
{
int row, col;
for (row = 0; row < ROWS; row++)
{
for (col = 0; col < COLS; col++)
{
b[row][col] = trans[a[row][col]];
//↑进行数字对应的字符转换;
}
}
return;
}
//-------------
//----------------------------2020年4月5日 -------------------------------