C和指针4.5
来源:互联网 发布:高清网络摄像机软件 编辑:程序博客网 时间:2024/05/19 02:24
编写一个程序,从标准输入一行一行的读取文本,并完成如下任务:如果文件中有两行或更多行相邻的文本内容相同,那么就打印出其中一行,其余的行不打印,你可以假设文件中的文本行在长度上不会超过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//最大处理行数
#defineMAX_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++;
}
}
分析:用到了从控制台直接输入到数组,用到了二维数组形参,值得学习,他在处理输出相同行的方法比较巧妙,反正就是输出第一第二行相同,第三行不同,所以不管你有多少行相同就只递推到这个条件输出!
- C和指针4.5
- c和c指针
- 【C和指针】函数指针
- 【C和指针】const指针
- 《c和指针》函数指针
- c和指针详解------指针
- C指针和指针的指针
- 【c/c++】指针数组和数组指针
- 【c/c++】指针函数和函数指针
- C和指针
- c和指针
- C和指针学习
- 《C 和指针》
- C和指针
- c和指针
- 002-C和指针
- C和指针
- C和指针
- 周总结
- 一个程序猿成长记:设置select的selected属性
- POJ 2376Cleaning Shifts
- Java递归应用:输出树形菜单
- 实现163收件人显示效果支持编辑删除,自动提示及邮件地址验证
- C和指针4.5
- 黑马程序员--Eclipse的基本操作(我们的课堂练习)
- PHP-校花评选-埃洛等级分系统(Elo rating system)
- 学一个人要尊重她的事业,她的朋友,她的一切。
- 关于proteus闪退问题
- CodeForces 498A-Crazy Town-简单计算几何
- 100Same Tree
- Android进程与线程基本知识
- 杭电oj 1009