user-0 提问: 一个C语言需求，求大神分析下

回复:
user: user-1
content: 五楼大神！顶一个！

user: user-2
content: 引用 10 楼 huangaqz001 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 没实际编译链接调试，仅供参考： 请对以下源文件内容的各种测试用例分别测试： ◆0字节 ◆一行含error ◆两行，其中一行含error ◆五行，第三行含error ◆六行，第三行含error ◆六行，第三行和第四行含error ◆七行，第三行和第五行含error ◆…… #include <stdio.h> #include <string.h> static char ln[3][10000]; int i,s; FILE *f; int main() {     f=fopen("input.txt","r");     if (NULL==f) {         printf("Can not open file input.txt!\n");         return 1;     }     s=0;     i=0;     while (1) {         if (NULL==fgets(ln[i],10000,f)) break;         if (strstr(ln[i],"error")) {             if (s==0) {                 printf("%s",ln[(i+1)%3]);                 printf("%s",ln[(i+2)%3]);                 s=3;             }         }         if (s>0) {             printf("%s",ln[i]);             s--;         }         i=(i+1)%3;     }     fclose(f);     return 0; }   大侠，非常感谢你的回答，你这个代码我测试过了，是好使的。 我是菜鸟，我想问下如果那个行数要通过参数传入，那么这个改怎么实现。数组怎么定义[/quote] #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXL 1000 int L; static char ln[MAXL][10000]; int i; int j; int s; FILE *f; int main(int argc,char **argv) {     if (argc<3) {         printf("Usage: %s filename lines\n",argv[0]);         return 1;     }     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not open file [%s]!\n",argv[1]);         return 2;     }     L=atoi(argv[2]);     if (L<2 || 1000<L) L=2;     s=0;     i=0;     while (1) {         if (NULL==fgets(ln[i],10000,f)) break;         if (strstr(ln[i],"error")) {             if (s==0) {                 for (j=1;j<L;j++) printf("%s",ln[(i+j)%L]);                 s=L;             }         }         if (s>0) {             printf("%s",ln[i]);             s--;         }         i=(i+1)%L;     }     fclose(f);     return 0; }

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:没实际编译链接调试，仅供参考： 请对以下源文件内容的各种测试用例分别测试： ◆0字节 ◆一行含error ◆两行，其中一行含error ◆五行，第三行含error ◆六行，第三行含error ◆六行，第三行和第四行含error ◆七行，第三行和第五行含error ◆…… #include <stdio.h> #include <string.h> static char ln[3][10000]; int i,s; FILE *f; int main() {     f=fopen("input.txt","r");     if (NULL==f) {         printf("Can not open file input.txt!\n");         return 1;     }     s=0;     i=0;     while (1) {         if (NULL==fgets(ln[i],10000,f)) break;         if (strstr(ln[i],"error")) {             if (s==0) {                 printf("%s",ln[(i+1)%3]);                 printf("%s",ln[(i+2)%3]);                 s=3;             }         }         if (s>0) {             printf("%s",ln[i]);             s--;         }         i=(i+1)%3;     }     fclose(f);     return 0; }   大侠，非常感谢你的回答，你这个代码我测试过了，是好使的。 我是菜鸟，我想问下如果那个行数要通过参数传入，那么这个改怎么实现。数组怎么定义

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:没实际编译链接调试，仅供参考： 请对以下源文件内容的各种测试用例分别测试： ◆0字节 ◆一行含error ◆两行，其中一行含error ◆五行，第三行含error ◆六行，第三行含error ◆六行，第三行和第四行含error ◆七行，第三行和第五行含error ◆…… #include <stdio.h> #include <string.h> static char ln[3][10000]; int i,s; FILE *f; int main() {     f=fopen("input.txt","r");     if (NULL==f) {         printf("Can not open file input.txt!\n");         return 1;     }     s=0;     i=0;     while (1) {         if (NULL==fgets(ln[i],10000,f)) break;         if (strstr(ln[i],"error")) {             if (s==0) {                 printf("%s",ln[(i+1)%3]);                 printf("%s",ln[(i+2)%3]);                 s=3;             }         }         if (s>0) {             printf("%s",ln[i]);             s--;         }         i=(i+1)%3;     }     fclose(f);     return 0; }    额，刚引用错了，是这位大侠。  要的就是这位大侠这样的，用代码来分析需求。前几个大侠那种光说，没啥用。

user: user-0
content: 引用 4 楼 yy21yeyu 的回复:这个直接用两个缓冲区，记录当前行的上面两行不就完了，这样就是效率低了点。回读效率高，就是控制有点麻烦，可以用两个int记录一下当前行的上面两行起始位置的offset，然后setfilepointer或者fseek  要的就是这位大侠这样的，用代码来分析需求。前几个大侠那种光说，没啥用。

user: user-3
content: 引用 6 楼 Ronux 的回复:5楼的代码很完美。  1.总是保存最近3行的数据 2.如果最近一行包含error，则输出前两行，并设置标记 3.输出含error的一行，并输出接下来的两行。 这个实现不错

user: user-4
content: 5楼的代码很完美。  1.总是保存最近3行的数据 2.如果最近一行包含error，则输出前两行，并设置标记 3.输出含error的一行，并输出接下来的两行。

user: user-2
content: 没实际编译链接调试，仅供参考： 请对以下源文件内容的各种测试用例分别测试： ◆0字节 ◆一行含error ◆两行，其中一行含error ◆五行，第三行含error ◆六行，第三行含error ◆六行，第三行和第四行含error ◆七行，第三行和第五行含error ◆…… #include <stdio.h> #include <string.h> static char ln[3][10000]; int i,s; FILE *f; int main() {     f=fopen("input.txt","r");     if (NULL==f) {         printf("Can not open file input.txt!\n");         return 1;     }     s=0;     i=0;     while (1) {         if (NULL==fgets(ln[i],10000,f)) break;         if (strstr(ln[i],"error")) {             if (s==0) {                 printf("%s",ln[(i+1)%3]);                 printf("%s",ln[(i+2)%3]);                 s=3;             }         }         if (s>0) {             printf("%s",ln[i]);             s--;         }         i=(i+1)%3;     }     fclose(f);     return 0; }

user: user-5
content: 这个直接用两个缓冲区，记录当前行的上面两行不就完了，这样就是效率低了点。回读效率高，就是控制有点麻烦，可以用两个int记录一下当前行的上面两行起始位置的offset，然后setfilepointer或者fseek

user: user-6
content: 每读完一行，首先判断是否有error，有则把上一行缓存的打印出来，同时也把下一行打印出来，并缓存；没有则缓存该行 用变量保存一行字符串就可以了

user: user-7
content: 把文件内容搞进内存里  加一个行索引

user: user-0
content: 读关键字已经没啥问题了，关键是这个上下几行，不知道怎么实现比较好。