一个C语言需求,求大神分析下

huangaqz001 2014-03-06 03:40:17
读文件,一行一行的读,都读到一行有error这个关键字,就把这行的上下2行都pintf打印出来
while(读一行){
if(error){
printf(这一行和这行的上下2行)
{
}

如:内容

1aaaaaaaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbbbbbbb
3ccccccccccccccccccccc
4ddddddddddddddddddddd error
5eeeeeeeeeeeeeeeeeeeee
6ffffffffffffffffffffff
7gggggggggggggggggggggg
8hhhhhhhhhhhhhhhhhhhhhhh
9iiiiiiiiiiiiiiiiiiiiiiii

要求打印结果:
2bbbbbbbbbbbbbbbbbbbbb
3ccccccccccccccccccccc
4ddddddddddddddddddddd error
5eeeeeeeeeeeeeeeeeeeee
6ffffffffffffffffffffff

...全文
196 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Footprints明轩 2014-03-07
  • 打赏
  • 举报
回复
五楼大神!顶一个!
赵4老师 2014-03-07
  • 打赏
  • 举报
回复
引用 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;
}
huangaqz001 2014-03-06
  • 打赏
  • 举报
回复
引用 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;
}
大侠,非常感谢你的回答,你这个代码我测试过了,是好使的。 我是菜鸟,我想问下如果那个行数要通过参数传入,那么这个改怎么实现。数组怎么定义
huangaqz001 2014-03-06
  • 打赏
  • 举报
回复
引用 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;
}
额,刚引用错了,是这位大侠。 要的就是这位大侠这样的,用代码来分析需求。前几个大侠那种光说,没啥用。
huangaqz001 2014-03-06
  • 打赏
  • 举报
回复
引用 4 楼 yy21yeyu 的回复:
这个直接用两个缓冲区,记录当前行的上面两行不就完了,这样就是效率低了点。回读效率高,就是控制有点麻烦,可以用两个int记录一下当前行的上面两行起始位置的offset,然后setfilepointer或者fseek
要的就是这位大侠这样的,用代码来分析需求。前几个大侠那种光说,没啥用。
心是菩提树 2014-03-06
  • 打赏
  • 举报
回复
引用 6 楼 Ronux 的回复:
5楼的代码很完美。 1.总是保存最近3行的数据 2.如果最近一行包含error,则输出前两行,并设置标记 3.输出含error的一行,并输出接下来的两行。
这个实现不错
Ronux 2014-03-06
  • 打赏
  • 举报
回复
5楼的代码很完美。 1.总是保存最近3行的数据 2.如果最近一行包含error,则输出前两行,并设置标记 3.输出含error的一行,并输出接下来的两行。
赵4老师 2014-03-06
  • 打赏
  • 举报
回复
没实际编译链接调试,仅供参考: 请对以下源文件内容的各种测试用例分别测试: ◆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;
}
yy21yeyu 2014-03-06
  • 打赏
  • 举报
回复
这个直接用两个缓冲区,记录当前行的上面两行不就完了,这样就是效率低了点。回读效率高,就是控制有点麻烦,可以用两个int记录一下当前行的上面两行起始位置的offset,然后setfilepointer或者fseek
__cc__ 2014-03-06
  • 打赏
  • 举报
回复
每读完一行,首先判断是否有error,有则把上一行缓存的打印出来,同时也把下一行打印出来,并缓存;没有则缓存该行 用变量保存一行字符串就可以了
derekrose 2014-03-06
  • 打赏
  • 举报
回复
把文件内容搞进内存里 加一个行索引
huangaqz001 2014-03-06
  • 打赏
  • 举报
回复
读关键字已经没啥问题了,关键是这个上下几行,不知道怎么实现比较好。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧