Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:不打印同一行就读取文件两次_C_File_Io_Getopt - Fatal编程技术网

C:不打印同一行就读取文件两次

C:不打印同一行就读取文件两次,c,file,io,getopt,C,File,Io,Getopt,我正试图找出如何做到这一点,但我是C语言的新手,我想知道我的逻辑是否是解决这个问题的最有效的方法 我能想到的最简单的方法是: 读第一行 将该行存储在缓冲区1中 读第二行 将第二行存储在缓冲区2中 如果缓冲区1!=buffer2、打印buffer1和擦除buffer1。将行3存储在缓冲区1中。重复步骤4 如果buffer1=buffer2,则擦除buffer1,将行3存储在buffer1中,然后从步骤4开始重复 如果文件包含: ok ok ok ok 结果应该是: ok ok ok 将行

我正试图找出如何做到这一点,但我是C语言的新手,我想知道我的逻辑是否是解决这个问题的最有效的方法

我能想到的最简单的方法是:

  • 读第一行

  • 将该行存储在缓冲区1中

  • 读第二行

  • 将第二行存储在缓冲区2中

  • 如果缓冲区1!=buffer2、打印buffer1和擦除buffer1。将行3存储在缓冲区1中。重复步骤4

  • 如果buffer1=buffer2,则擦除buffer1,将行3存储在buffer1中,然后从步骤4开始重复

  • 如果文件包含:

    ok ok
    
    ok
    
    ok
    
    结果应该是:

    ok ok
    
    ok
    
    将行3存储在缓冲区1中

    不是你想要的。一点也不要储存。顺便说一句,很难理解你想在这里做什么。如果您不想打印本例的第3行,只需忽略步骤5部分,即只打印一个缓冲区:


    #包括
    内部主(空)
    {
    字符buff[100];
    int-diff,ch;
    未签名pos;
    对于(pos=0,diff=1;;){
    ch=getc(标准偏差);
    如果(ch!=buff[pos]){
    如果(!diff)用于(;diff=sizeof buff){;}//在这里处理溢出
    如果(ch='\n'){diff=pos=0;}
    }
    返回0;
    }
    
    太棒了!现在:在实际代码中尝试一下(一旦它工作了,试着只使用一个缓冲区来完成…)有没有一个函数可以在C中逐行读取文件?我试过fgets和getLine,但都没用。
    #include <stdio.h>
    
    int main(void)
    {
    char buff[100];
    int diff,ch;
    unsigned pos;
    
    for(pos=0,diff=1;;){
            ch = getc(stdin);
    
            if (ch != buff[pos] ) {
                if (!diff) for ( ; diff < pos; diff++) putc(buff[diff], stdout);
                diff=1;
                }
            if (ch == EOF)break;
            if (diff) putc(ch,stdout);
            buff[pos++] = ch;
            if (pos >= sizeof buff) {;} //handle overflow here
            if (ch == '\n') {diff = pos = 0; }
            }
    return 0;
    }