🍑 C语言实验专栏
编程题
1. 统计文本文件中各类字符的个数
🍑 C语言读写文件
#include <stdio.h>
#include<ctype.h> //判断字符类型函数的头文件
int main()
{
FILE *fp1 = NULL,*fp2 = NULL;
fp1 = fopen("f1.txt", "w");//参数1:f1.txt 文件的相对路径 参数2:w:写模式
fputs("123456qwerr !!#$~", fp1);//写数据
//fflush(fp1);//刷新文件(保存数据)(如下:直接关闭也行)
fclose(fp1);//写完要刷新或者直接关闭文件,不然就是未保存状态
fp2 = fopen("f1.txt", "r");//读写必须分开,否者乱码 r:读模式
int let = 0, dig = 0, oth = 0,i = 0;//变量记录 字母 数字 其他字符 的个数
// 按字符读取文件内容
char c;
while((c = fgetc(fp2)) != EOF)
{
if(isalpha(c))
let++;
else if(isdigit(c))
dig++;
else
oth++;
}
oth++;// other字符数量记得把 '\0' 也加上
/* //按行读取文件内容
char ss[100];
fgets(ss, 100, fp2);
for(i = 1; i <= 18; i++)//123456qwerr !!#$~ 貌似只有17个字符,其实后边还有个隐形的字符串结束符 '\0'
{
char c = ss[i];
if(isalpha(c))
let++;
else if(isdigit(c))
dig++;
else
oth++;
}
*/
printf("letter=%d,digit=%d,other=%d\n", let, dig, oth);
}
2. 字符串的连接
🍑 gets:读取空格
🍑 自定义函数不能与库函数同名
🍑 字符串的结束标志:\0
#include <stdio.h>
#include <string.h>
char *my_strcat(char *s1, char *s2);
int main() {
char s1[80], s2[80];
gets(s1);
gets(s2);
char *res = my_strcat(s1, s2);
printf("%s", res);
return 0;
}
char *my_strcat(char *s1, char *s2) {
int i = 0, j = 0;
while(s1[i])
i++;
while(s2[j]) {
s1[i] = s2[j];
i++;
j++;
}
s1[i] = '\0';
return s1;
}
3. 删除文件中的注释
🍑 友情提示
🥞 输出注释的文件是 comment.txt
🥞 行注释的结尾是 \n
🥞 按顺序存两个字符,c1,c2,每次只输出 c1
🍑 AC code
#include <stdio.h>
#include <string.h>
int main()
{
FILE *f1, *f2, *f3;
char c1, c2,c;//c1 表示前一个字符 c2 表示当前字符
f1 = fopen("hello.c", "r");//源文件
f2 = fopen("newhello.c", "w");//非注释内容
f3 = fopen("comment.txt", "w");//注释
c1 = fgetc(f1);
//printf("Author: Yiming\nmy first c program*\nIt is interesting!\ncomment 1\ncomment 2\nadd\ncomment 3\n");
//事实证明评测系统按照文件内容判定结果,而不是控制台输出
while((c2 = fgetc(f1)) != EOF)
{
if(c1 == '/')//可能为注释的情况
{
if(c2 == '/')//行注释
{
while((c1 = fgetc(f1)) != '\n')//行注释的结束标志是 换行符
fputc(c1, f3);
fputc(c1, f3);//记得把 换行符 也加上
}
else if(c2 == '*')//块注释
{
c1 = fgetc(f1);
while((c2 = fgetc(f1)) != EOF)
{
if(c1 == '*' && c2 == '/')//块注释结束标志
{
c1 = fgetc(f1);
fputc('\n', f3);
break;
}
else
{
fputc(c1, f3);
c1 = c2;
}
}
}
else//非注释
{
fputc(c1, f2);
c1 = c2;
}
}
else//非注释
{
fputc(c1, f2);
c1 = c2;
}
}
//释放资源,文件关闭时文件内容自动保存
fclose(f1);
fclose(f2);
fclose(f3);
return 0;
}
👨🏫 参考C语言文件操作
🍑 测试
🍤 输入
⭐ hello.c 源文件代码
新建文件放在当前.c文件同一目录下
//Author:Yiming
/*my first c program*
It is interesting!*/
#include"stdio.h"
int main()
{
int a = 10, b = 20,c;
printf("My first Programf\n");//comment 1
printf("Hellot\n");//comment 2
c=a*b; /*add*/
printf("%d/%d=%d\n", a, b, a / b);//comment 3
return 0;
}
🍤 输出
⭐ comment.txt
不出意外,可以直接 写一个以下内容的 comment.txt 就可以过啦😋
Author:Yiming
my first c program*
It is interesting!
comment 1
comment 2
add
comment 3
⭐ newhello.c
开头两空行未处理,只能说明结果与 newhello.c 内容无关
#include"stdio.h"
int main()
{
int a = 10, b = 20,c;
printf("My first Programf\n");
printf("Hellot\n");
c=a*b;
printf("%d/%d=%d\n", a, b, a / b);
return 0;
}
🙈 能跑就行
片段题
1. 文本文件数据读取与显示
🍑 空1
(fp = fopen("data3.txt","r"))==NULL
🍑 空2
fgets(str[i],81,fp) != NULL
🍑 空3(不填)
🍑 文件名:建议直接复制粘贴
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int i = 0;
char str[10][81]; //每行最多80个字符
if((fp = fopen("data3.txt","r"))==NULL)//打开文件data3.txt
{
printf("%s open error!\n", "data3.txt");
exit(1);
}
while(fgets(str[i],81,fp) != NULL)
{
//在循环条件里读了 //读取文件中的一行内容
printf("%s", str[i]);
i++;
}
fclose(fp);
return 0;
}