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 ...
随机推荐
- #dp,二项式反演,容斥#CF285E Positions in Permutations
题目 问有多少个长度为 \(n\) 的排列 \(P\) 满足 \(|P_i-i|=1\) 的 \(i\) 的个数恰好为 \(k\) 个 分析 设 \(dp_{i,j,k}\) 表示前 \(i\) 个数 ...
- OpenHarmony创新赛|赋能直播第四期
开放原子开源大赛OpenHarmony创新赛进入了中期评审环节,为了解决开发者痛点,本期以三方库移植.MQTT移植案例.开发工具介绍的3节系列技术课程,帮助开发者提升开发效率,为作品的创新能力奠定坚 ...
- OpenHarmony——内核对象队列之算法详解(下)
前言 OpenAtom OpenHarmony(以下简称"OpenHarmony") LiteOS-M 内核是面向 IoT 领域构建的轻量级物联网操作系统内核,具有小体积.低功耗. ...
- HMS Core 3D精准室内定位技术,打造“店铺级”出行体验
2022年4月28日,在华为折叠旗舰及全场景新品发布上,华为Mate Xs 2折叠屏手机搭载由HMS Core定位服务(Location Kit)提供的3D精准室内定位技术,为用户提供了"店 ...
- DevEco Studio新特性分享-跨语言调试,让调试更便捷高效
原文:https://mp.weixin.qq.com/s/JKVLQXu1z1zAoF5q49YEGg,点击链接查看更多技术内容. HUAWEI DevEco Studio是开发Harmony ...
- github 小技巧
前言 简单记一下github 小技巧,因为经常忘. 正文 就是如何快速搜索到自己想找的项目. 如果自己知道项目名,那么直接输入就可以搜索到. 如果不是,那么一般要通过高级搜索. https://git ...
- nginx重新整理——————http请求的11个阶段[十二]
前言 已经到了关键的http请求的11个阶段了. 正文 概念图: 11 个阶段的处理顺序: 那么就来介绍一下: 先来了解一下postread阶段的realip这个处理,realip 是 real ip ...
- mysql 重新整理——逻辑架构[二]
前言 在此简洁逻辑架构,mysql的基础逻辑架构其实和sql server很像的. 正文 首先是客户端,发起了连接. 然后呢连接池后那一块,就是有分析器的那一块,那一块是干啥的呢. 其实我们写的语句呢 ...
- linux 忘记密码怎么破?
前言 适合硬件在自己旁边的,不适合云服务器,云服务器很方便的,可以直接重置密码,因为云服务器都是虚拟机. 正文 1.步骤 进入到可以看到节目的视图,按下esc键进入下面的视图! 2.接着进入下面的界面 ...
- 英文A+B
A+B 题目描述 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入描述: 测试输入包含若干测试用例,每个测试用例占一行,格式为"A ...