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++;

    }

}

分析:用到了从控制台直接输入到数组,用到了二维数组形参,值得学习,他在处理输出相同行的方法比较巧妙,反正就是输出第一第二行相同,第三行不同,所以不管你有多少行相同就只递推到这个条件输出!
1 0
原创粉丝点击