C语言:如何实现在txt文件中删除超链接、统计单词数量、生成单词列表 (文本流操作并解决乱码)
1、首先读取原文件内容文本流(包含中英文)
2、删除超链接
3、统计单词数量
4、去除重复单词
读取文件需要自己在文本笔记中保存一个网页,保存为txt文件
注意的是,在这个代码实现过程中,我学到的是如何避免输入内容时出现乱码的现象,第一是必须要用fprintf、fread、fwrite等 用于文本流的函数,而不能用fputc、fputs这些用于二进制文本的函数,虽然说当你内容少的时候,可能不会出现乱码情况,当你输入内容多起来的时候就不一定了。(以上只是向txt文件输入内容的时候)
所以记住,fprintf是向txt文件原原本本的输出你想要输出的东西。
读取出现乱码怎么办:网上有很多说法,你可以试试保存txt文件的时候按照其他博客大佬那样修改保存的格式,
但是我这里使用的是系统命令,
也就是在int main(){后面加上一段代码:system("mode con cp select=65001");
代码表示,将代码页转换为UTF-8,因为计算机在读取内容的时候,是用二进制的方式读取,读进去的时候自然会有乱码现象,所以我们无须在文本文件下面另存为UTC-8类型(我自己另存了也不行,读出来还是会有乱码现象),所以我最后用命令行的方式解决了这个困扰我很久的世纪难题!!!!!!!!!!!!!!最后记得输出%d或者其他%lf等等数字的时候需要改回你自己计算机的代码页,我的是936,所以在输出多少个单词的时候再次用system命令行修改代码页
system("mode con cp select=65001");
显示代码页:
其中65001代表UTF-8,输出为:
Status for device CON:
----------------------
Lines: 9001
Columns: 120
Keyboard rate: 31
Keyboard delay: 1
Code page: 65001
代码页就是DOS中显示的语言
437代表美式英语即可输出为:
Status for device CON:
----------------------
Lines: 40
Columns: 100
Keyboard rate: 31
Keyboard delay: 1
Code page: 437
936(936表示简体中文)输出:
设备状态 CON:
---------
行: 40
列: 100
键盘速度: 31
键盘延迟: 1
代码页: 936
#include<stdio.h>
#include<string.h>
#include<ctype.h>
/*
/ ********************************************** /
This is Jackson.W's Experiment report.
Time: 2022.03.05
school num: 20203005129
/ ********************************************** /
//暂时不修改原文件内容
-----------------------------
创建一个临时文件,将源文件进行扫描,超链接不扫描,操作完成后再进行临时文件内容复制到原文件中,就可以实现源文件也删除了超链接
-----------------------------
第一大功能实现:
将扫描到的字符串一个一个录入到字符串中,
(删除超链接)
创建一个临时文件,将源文件进行扫描,超链接不扫描
1,若碰到 < 符号,判断是否是超链接
2,设置一个函数,碰到的 < 的地方,在此处继续扫描下去,直到遇到 > 符号
3,记录此处的位置,继续录入字符到字符串中去
4,直到文件的末尾处
测试结果: 该文件的字符串长度:14254
第二大功能:将删除超链接后的文件内容复制到另一个文本中去
第三大功能:统计单词数目
第四大功能:去除重复单词
a) 建立一个结构数组,包含:存字符串的数组, 计算单词数量int ,定义一个字符串数组copy,用来缓存文件单词
b) 读取第一个单词,录进copy中,再与结构数组的字符串进行比较
c) 如果不同,则存进第i个数组结构的字符串
d) 如果相同,就清空copy的字符串,再进行下一次的扫描
e)
第五大功能:将单词表存进另一个txt文件
*/
typedef struct _Wordc{
char s[20];
int num;
}Wordc;//定义两百个空间,录入单词
void prt(char ch, FILE *fp);//输出文本内容
void deltxt(char ch, FILE *fp, FILE *temp);//删除超链接
void copytxt(char ch, FILE *fp, FILE *null_f);//实现两个文件的复制,第一个内容复制到另一个文件内容中去
int madeword(char *ch, FILE *fp);//实现将文件中的单词提取出来
void wordcc(Wordc *wordc, FILE *fp1, FILE *fp2, char *copy);//去除重复单词,生成单词表打印出来
void wbiao(Wordc *wordc, FILE *fp, int m);
int main()
{
int i;
system("mode con cp select=65001");
char ch;
char ch1[20], ch2[20];
//char *w[20];
FILE *fp1 = NULL;
FILE *fp2 = NULL;
char copy[20];
Wordc wordc[700];
//FILE *tmpfp = NULL;
//tmpfp = tmpfile();//临时文件,测试代码要用
/************输出原始文本内容**************/
fp1 = fopen("/tmp/shuju.txt", "r");
prt(ch, fp1);
fclose(fp1);
/**************************************/
/************删除超连接***************/
fp1 = fopen("/tmp/shuju.txt", "r");
fp2 = fopen("/tmp/new.txt", "w");
//deltxt(ch1, fp1, tmpfp);用临时文件测试,实现删除超链接
deltxt(ch, fp1, fp2);
fclose(fp1);
fclose(fp2);
/*************************************/
/***************删除超连接后,将文件复制到新的文本**************/
fp1 = fopen("/tmp/shuju.txt", "w");
fp2 = fopen("/tmp/new.txt", "r");
copytxt(ch, fp2, fp1);
fclose(fp1);
fclose(fp2);
/*************************************/
/************输出删除超链接后的内容**************/
fp1 = fopen("/tmp/shuju.txt", "r");
prt(ch, fp1);
fclose(fp1);
/**************************************/
/************统计单词数目,除去重复单词, 打印出单词相同的单词表,并且将单词表复制给新的文本里面*************/
fp1 = fopen("/tmp/new.txt", "r");
fp2 = fopen("/tmp/wordsclub.txt", "w");
wordcc(wordc, fp1, fp2, copy);
fclose(fp1);
fclose(fp2);
/**********************************************************************************************************/
/*将单词表所在文件的单词内容打印出来*/
fp2 = fopen("/tmp/wordsclub.txt", "r");
prt(ch, fp2);
fclose(fp2);
/*************************************/
// printf("\n***************\n");
// for(i = 0; i < 200; i++)
// {
// printf("%s ", wordc[i].s);
// if(i % 10 == 0)
// {
// printf("\n");
// }
// }
return 0;
}
void prt(char ch, FILE *fp)//输出文本内容
{
while(!feof(fp))
{
ch = fgetc(fp);
//fscanf(fp, "%c", &ch);
//fread(ch, 20, 1, fp);
putchar(ch);
//printf("%s", ch);
}
}
void deltxt(char ch, FILE *fp, FILE *temp)//删除超链接 ,temp为另一个文件,可为临时文件,也可为另一个文件
{
char copy[11];
//char ch;
int i;
int index;
char tcopy[11];
while(!feof(fp))
{
//ch = getc(fp);//判断是否碰到<符号
pos_1:
for(i = 0; i < 10; i++)
{
copy[i] = ' ';
tcopy[i] = ' ';
}
//copy[9] = '\0';
i = 0;
//fread(copy, 10, 1, fp);
for(i = 0; i < 10; i++)
{
copy[i] = getc(fp);//读取
if(copy[i] == '<')//当读取到<的时候 kjihi<dvs>inini<fsdgg vcgcnsfg>
{
copy[i] = '\0';//让他结束扫描,直接把字符串写进去
fprintf(temp, "%s", copy);
while(1)
{
ch = getc(fp);
while(ch == '>')
{
goto pos_1;//当遇到>结尾的时候就继续跳到read处继续扫描
}
}
//putchar(ch);//测试打印出来是否删除了超链接
//putc(ch, temp);//写到临时文件里面去
//fprintf(temp, "%s", ch);
}
else if(i == 9)//当一直没遇到<
{
copy[10] = '\0';
fprintf(temp, "%s", copy);
}
}
// else
// {
// while(ch != '>')//当还没到>符号的时候继续往下扫描
// {
// //ch = getc(fp);
// }
// }
}
}
int madeword(char *ch, FILE *fp)//实现将文件中的单词提取出来, 默认是在当前文件流中继续扫描下一个
{
char chp;
int i = 0;
char temp;
while(!feof(fp))
{
temp = getc(fp);
//ch[i] = chp;
//printf("\n*************%c*************\n", chp);
if((temp >= 65 && temp <= 90) || (temp >= 97 && temp <= 122) ) //确定是字母
{
chp = temp;
i = 0;
while(1)
{
ch[i] = chp;
printf("%c", ch[i]);
chp = getc(fp);
if(!((chp >= 65 && chp <= 90) || (chp >= 97 && chp <= 122)))
{
i++;
ch[i] = '\0';
//printf("\n%s\t", ch);
break;
}
i++;
}
break;
}
}
}
void wordcc(Wordc *wordc, FILE *fp1, FILE *fp2, char *copy)//去除重复单词,生成单词表打印出来
{
/*
typedef struct _Wordc{
char s[20];
int num;
}Wordc;//定义两百个空间,录入单词
四大功能:去除重复单词
a) 建立一个结构数组,包含:存字符串的数组, 计算单词数量int ,定义一个字符串数组copy,用来缓存文件单词
b) 读取第一个单词,录进copy中,再与结构数组的字符串进行比较
c) 如果不同,则存进第i个数组结构的字符串
d) 如果相同,就清空copy的字符串,再进行下一次的扫描
e)
*/
int i = 0,j = 0, m = 1;
int k = 0;
//copy[20] = "";
int index = 0;//当前结果数组的最大下标
char ch;//读取流的字符
int numwords = 0;
int num = 0;
int start = 0;
for (j = 0; j < 200; j++)
{
wordc[j].num = 0; //把结构体数组成员的num全部赋值为0
}
while(!feof(fp1))
{
ch = fgetc(fp1);
if(isalpha(ch))
{
start = 1;//标志进来过这个语句,所以已经有一个字母开头,下面就可以利用这个条件进行判断
if(isupper(ch))
{
ch = tolower(ch);
}
copy[i++] = ch;
}
else if(!isalpha(ch) && start == 1)//符合条件就开始搜索是否有相同单词
{
copy[i] = '\0';//添加\0 变成字符串之后方便比较和其他操作
numwords++;
start = 0;
//printf("%s*******88\n", copy);
for(j = 0; j < m; j++)
{
if(strcmp(copy, wordc[j].s) == 0)//表示出现过
{
wordc[j].num++;
k = 0;//表示有重复单词
break;
}
else
{
k = 1;//遍历所有元素,无影响,因为碰到上面有重复的才会break,这里即使等于1 了也不会出来,继续遍历
}
}
if(k == 1)
{
for(j = 0; j < i + 1; j++)
{
wordc[m].s[j] = copy[j];
}
wordc[m].num++;//新成员加一
m++;//移动到结构的下一个新空间
}
i = 0;
for(j = 0; j < 20; j++)
{
copy[j] = ' ';//清空copy内的字符内容
}
}
}
system("mode con cp select=936");
printf("一共有%d个不同的单词\n" , m-1);
printf("总单词数量:%d\n", numwords);
//system("mode con cp select=65001");
// for(j = 0; j < m; j++)
// {
// printf("%s\n", wordc[j].s);
// }
/**************************************************生成单词表的函数在这里**********************/
wbiao(wordc, fp2, m);
}
void wbiao(Wordc *wordc, FILE *fp, int m)
{
//system("mode con cp select=437");
int i ,j;
for(i = 0; i < m; i++)
{
//fwrite(wordc[i].s, sizeof(wordc[i].s[0]), sizeof(wordc[i].s) / sizeof(wordc[i].s[0]), fp);
fprintf(fp, "%s", wordc[i].s);//链表中已经把字符字符串化,所以直接每一个单词输出就行
fprintf(fp, " ");
if(i % 10 == 0)
{
fprintf(fp, "\n");
//putc()
}
}
}
C语言:如何实现在txt文件中删除超链接、统计单词数量、生成单词列表 (文本流操作并解决乱码)的更多相关文章
- python : 将txt文件中的数据读为numpy数组或列表
很多时候,我们将数据存在txt或者csv格式的文件里,最后再用python读取出来,存到数组或者列表里,再做相应计算.本文首先介绍写入txt的方法,再根据不同的需求(存为数组还是list),介绍从tx ...
- 深度学习tensorflow实战笔记(1)全连接神经网络(FCN)训练自己的数据(从txt文件中读取)
1.准备数据 把数据放进txt文件中(数据量大的话,就写一段程序自己把数据自动的写入txt文件中,任何语言都能实现),数据之间用逗号隔开,最后一列标注数据的标签(用于分类),比如0,1.每一行表示一个 ...
- 按行读取TXT文件中的内容
public Dictionary<int, string> GetDicFromLog() { try { StreamReader sr = new StreamReader(file ...
- java 写一个"HelloJavaWorld你好世界"输出到操作系统文件Hello.txt文件中
package com.beiwo.homework; import java.io.File; import java.io.FileOutputStream; import java.io.IOE ...
- 从txt文件中读取数据放在二维数组中
1.我D盘中的test.txt文件内的内容是这样的,也是随机产生的二维数组 /test.txt/ 5.440000 3.4500006.610000 6.0400008.900000 3.030000 ...
- 把cmd信息中的正常和异常输出分别输出到不同txt文件中
场景一: 1.大量滚动信息容纳不下,在小黑屏中被冲刷掉. 2.希望把正常输出和异常输出分别输出到不同地方. 相关命令 一共有4个输出到文件的命令,现以jar命令打war包举例说明: 命令 说明 举例 ...
- java将数据写入到txt文件中(txt有固定的格式)
java将数据写入到txt文件中,这个应该对于学过java I/O的人来说是很简单的事情了,但是如果要将数据以固定的格式写入到txt文件中,就需要一定的技巧了. 这里举个简单的例子,以供参考: 比如我 ...
- ORACLE 中写入txt文本与从Txt文件中读入数据 修改表结构
--创建一个表 DROP TABLE TEST CASCADE CONSTRAINTS ; CREATE TABLE TEST(A VARCHAR(30),B VARCHAR(30)); --查看具体 ...
- 读取同一文件夹下多个txt文件中的特定内容并做统计
读取同一文件夹下多个txt文件中的特定内容并做统计 有网友在问,C#读取同一文件夹下多个txt文件中的特定内容,并把各个文本的数据做统计. 昨晚Insus.NET抽上些少时间,来实现此问题,加强自身的 ...
- SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中
在数据库时候我设计了学生的分数为nvarchar(50),是为了在从TXT文件中读取数据插入到数据库表时候方便,但是在后期由于涉及到统计问题,比如求平均值等,需要int类型才可以,方法是:Conver ...
随机推荐
- #Tarjan#洛谷 4819 [中山市选]杀人游戏
题目 分析 缩点后显然只考虑入度为0的点的个数, 但是问题是如果有一个入度为0的点缩点前只有1个点 且它的出边上的所有点都可以被其它入度为0的点遍历, 那么可以将其它点全部排除后剩下的这个点就是凶手, ...
- 小师妹学JavaIO之:文件编码和字符集Unicode
目录 简介 使用Properties读取文件 乱码初现 字符集和文件编码 解决Properties中的乱码 真.终极解决办法 总结 简介 小师妹一时兴起,使用了一项从来都没用过的新技能,没想却出现了一 ...
- C# 中一维数组和二维数组详解
String[][]是二维数组.例如:String[][] str=new String[4][4],这是创建了一个有bai4行4列元素的数组. String[]代表一维数组.例如:String[] ...
- 【编译原理】Antlr 入门使用
前面文章我们学习了编译器前端的词法和语法分析工具,本篇我们来看看如何借助 Antlr 工具,快速生成词法和语法分析代码. 一.安装 mac 环境: 1)安装 brew install antlr 2) ...
- 最新CAMX-python融合技术应用与大气污染来源解析方法
大气污染问题既是局部.当地的,也是区域的,甚至是全球的.本地的污染物排放除了对当地造成严重影响外,同时还会在动力输送作用下,极大地影响下风向地区的大气环境状况.数值模式模拟是分析大气污染物时空分布和成 ...
- RestTemplate进行https请求时适配信任证书
转载请注明出处: 1.http协议请求 使用RestTemplate进行http协议的请求时,不需要考虑证书验证相关问题,以下为使用RestTemplate直接使用的代码示例: import org. ...
- RestfulApi 学习笔记——查询与过滤还有搜索(五)
前言 过滤和查询感觉是一个样子,实际上是不同含义.查询是查询一个主体,如果说要查询全部男职工但是名字中带良的,全部男职工 就是主体要查询的对象,然后名字中带良的表示的是过滤. 那么什么是搜索呢?搜索是 ...
- 力扣12(java)-整数转罗马数字(中等)
题目: 罗马数字包含以下七种字符:I, V, X, L, C, D, M 1 字符 数值 2 I 1 3 V 5 4 X 10 5 L 50 6 C 100 7 D 500 8 M 1000 例如, ...
- 如何从 0 到 1 开发 PyFlink API 作业
简介: 以 Flink 1.12 为例,介绍如何使用 Python 语言,通过 PyFlink API 来开发 Flink 作业. Apache Flink 作为当前最流行的流批统一的计算引擎,在实时 ...
- 如何避免出现SQL注入漏洞
简介: 本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因.并以几个常见漏洞存在形式,提醒技术同学注意相关问题.最后会根据原理,提供解决或缓解方案. 作者 | 阿里云安全 ...