C和指针4.5
2015-11-29 20:20
162 查看
编写一个程序,从标准输入一行一行的读取文本,并完成如下任务: 如果文件中有两行或更多行相邻的文本内容相同,那么就打印出其中一行, 其余的行不打印,你可以假设文件中的文本行在长度上不会超过128个字符。 考虑下面的输入文件。 this is the first line. Another line. And another. And another. And another. And another. Still more. Alomost done now -- Alomost done now -- Another line. Still more. Finished! 假定所有的行在尾部没有任何空白。根据这个输入文件,程序应该产生下列输出。 And another.
Alomost done now --
一开始要仔细读题,搞清楚题目的需求,我一开始是实在不知如何下手,对于题目的理解就是读取txt文档内容然后输出结果,对于文件流操作还不是很熟悉,学长一看到这题目说十分钟搞定!然后他坐在位置上写,我搬个凳子看他写,文件流FILE,fgets这些函数学长烂熟于心,根本都不要百度的,学长真是太厉害了,对于C语言的造诣如此之深!自愧不如!果真10分钟搞定了,并且他建立的文本输出结果也是正确的。。然后我们就去吃中饭了。
我想想下午我自己也一定要写出来! 先从把文件流正确读取:
整整是花了一个下午啊!!!自己太笨了,,,一下午的成功如下:
#include<iostream> #include <string.h> using namespace std; void main() { FILE *fp; fp=fopen("test.txt","r"); if (fp==NULL) //注意积累:一开始没有加,内存报错,查了半天,原来是txt文本没放在当前目录下,一开始都不认为是文件没有读取进来 { cout<<"读取错误!\n"; return; } char buf1[128]={0}; char buf2[128]={0}; // char *buf; // buf=NULL; 为什么不能这样呢? //学长说这样没有分配内存空间 fgets(buf1,128,fp); while (fgets(buf2,128,fp)!=NULL) //cout<<buf;while (fgets(buf2,128,fp)!=NULL) { //fgets(buf2,128,fp); int flg=strcmp(buf1,buf2); if(flg==0) { cout<<buf2; fgets(buf2,128,fp); int flg2=strcmp(buf1,buf2); while(!flg2) { fgets(buf2,128,fp); flg2=strcmp(buf1,buf2); } } strcpy(buf1,buf2); } }
不容易啊,发现不能2行2行的读,要一行一行的读取。
然后问学长要了他十分钟写出来的程序如下:
#include <stdio.h> #include <fstream> #include<iostream> #include <string.h> using namespace std; void main() { FILE *pFile=NULL; pFile=fopen("test.txt","r"); if(!pFile) { cout<<"文件读取错误"<<endl; return; } int fId=0; char fBuf1[128]={0}; char fBuf2[128]={0}; int flgsim=1; do { //cout<<fBuf; fgets(fBuf1,128,pFile); //char *Temp1=fBuf1; fgets(fBuf2,128,pFile); flgsim=strcmp(fBuf1,fBuf2); while(!flgsim) { fgets(fBuf2,128,pFile); if(strcmp(fBuf1,fBuf2)) { flgsim=1; cout<<fBuf1; break; }
} } while (fBuf2); }
我调试发现有问题,他是2行2行的读的,不连贯。 但是学长还是很厉害,一会儿就知道错哪里了,用了各种我没见过的函数,底下是学长修改的代码:
void main() { FILE *pFile=NULL; pFile=fopen("test.txt","r"); if(!pFile) { cout<<"文件读取错误"<<endl; return; } int fId=0; char fBuf1[128]={0}; char fBuf2[128]={0}; int flgsim=1; do { fgets(fBuf1,128,pFile); fgets(fBuf2,128,pFile); flgsim=strcmp(fBuf1,fBuf2); while(!flgsim) { int Foff=ftell(pFile); fgets(fBuf2,128,pFile); if(strcmp(fBuf1,fBuf2)) { flgsim=1; cout<<fBuf1; fseek(pFile,Foff,SEEK_SET); //cout<<"相同"<<endl; break; } } } while (fBuf2); }还是有点问题。
然后修改最后一行行读取的程序:
int fId=0; char fBuf1[128]={0}; char fBuf2[128]={0}; int flgsim=1; do { fgets(fBuf1,128,pFile); flgsim=strcmp(fBuf1,fBuf2); while(!flgsim) { fgets(fBuf1,128,pFile); if(strcmp(fBuf1,fBuf2)) { flgsim=1; cout<<fBuf1; cout<<"相同"<<endl; strcpy(fBuf2,fBuf1); break; } } strcpy(fBuf2,fBuf1); } while (!feof(pFile)); cout<<"结束"<<endl;
}
最后,我查看了下网上的这道题的别人的写法如下:
/***1.从标准输入一行一行地读取文本**2.如果有两行或多行相邻文本内容相同,即打印其中一行**3.文本行不超过128个字符(即char)*/#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_LINE 20 //最大处理行数#define MAX_COLS 128//最大处理列数/***处理输入行数据*/void range(char input[MAX_LINE][MAX_COLS],char output[MAX_LINE],int i);int main(){ char input[MAX_LINE][MAX_COLS]={0}; //存放输入行的 char output[MAX_LINE]={0}; //存放输出行 int i = 0; //数组下标 /* **把输入行依次存入input数组中用ctrl+z结束输入 */ while(gets(input[i])!=NULL) { i++; } range(input,output,i); //调用了range函数 return EXIT_SUCCESS;}void range(char input[MAX_LINE][MAX_COLS],char output[MAX_LINE],int i){ int flag = 0; //数组的下标 /* **遍历每一行并进行比较 */ while(flag<=i) { if(strcmp(input[flag],input[flag+1])==0) //当相邻两行相同时执行下列操作 { strcpy(output,input[flag]); //将相同的行复制到output数组中 if(strcmp(output,input[flag+2])!=0) //当相邻的第三行不与前值相等时才打印输出 printf("%s\n",output);} flag++; }}分析:用到了从控制台直接输入到数组,用到了二维数组形参,值得学习,他在处理输出相同行的方法比较巧妙,反正就是输出第一第二行相同,第三行不同,所以不管你有多少行相同就只递推到这个条件输出!
相关文章推荐
- Trie树及其应用
- u盘格式化的格式及分配单元大小
- 一个程序猿成长记:设置select的selected属性
- Access中一句查询代码实现Excel数据导入导出
- Spark SQL 之 Data Sources
- CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)
- hpuoj--校赛--爬楼梯(模拟)
- [Sort]希尔排序
- 南大软院大神养成计划--第十三天活动
- 《leetCode》:Simplify Path
- 10行代码搞定PHP页面静态化(10 lines of code to get PHP static pages)
- 10-01 到 11-29的项目总结
- 信息安全系统设计基础第十一周学习总结-吕松鸿
- 玩骰子(hdu校赛)
- CentOS7 安装 scala 2.11.1
- 黑马程序员——javaSE_反射
- hpuoj--校赛--2015年的第一场雪(暴力)
- 关于字符串的倒置
- hpuoj--校赛--2015年的第一场雪(暴力)
- python函数装饰器(decorators)