您的位置:首页 > 其它

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++;    }}分析:用到了从控制台直接输入到数组,用到了二维数组形参,值得学习,他在处理输出相同行的方法比较巧妙,反正就是输出第一第二行相同,第三行不同,所以不管你有多少行相同就只递推到这个条件输出!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: