关于C语言提取文本文件特定内容的方法,求大佬指教

自傷無色丶 2017-05-18 06:32:05

需求是这样的:读取上面图片的文件,输入动物名字则显示,它的相关信息。如输入北极熊
则显示以下信息:
北极熊北极熊是世界上最大的陆地食肉动物,又名白熊,憨态可掬。NO:A000000001。生命800速度100。
--------------------------------------------------------------------------------------------------------------------------------------------

实在想不出什么办法,求大佬指点下啊
...全文
382 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-05-19
  • 打赏
  • 举报
回复
仅供参考:
//NAME: essaie bla bla
//DIMENSION: 8
//DATA
//1  14  15
//2  11  10
//3  6   4
//4  7   13
//5  9   21
//6  19  3
//7  1   5
//8  8   8
//EOF
//
// 文本文件中可能还含有其他内容,但是需要用到的内容即以上

//比如data.txt:
//NAME: essaie bla bla
//其它内容
//DIMENSION: 8
//其它内容
//DATA
//其它内容
//1  14  15
//其它内容
//2  11  10
//其它内容
//3  6   4
//其它内容
//4  7   13
//其它内容
//5  9   21
//其它内容
//6  19  3
//其它内容
//7  1   5
//其它内容
//8  8   8
//其它内容
//EOF

// 目标是要获取NAME后字串,DIMENSION后数值,以及DATA以下的数值
// 其中NAME就是随便个字句,DIMENSION是城市数量,DATA以下是城市编号,X坐标,Y坐标
// 所有的这些将赋值给一个事先定义好的结构
#include <stdio.h>
#include <string.h>
#define MAXCPL   80   //每行最大字符数
#define MAXCITY  100  //每组数据中DATA最多项数,DIMENSION的最大值
#define MAXNAMEL 32   //NAME最大长度
struct S {
    char NAME[MAXNAMEL+1];
    int  DIMENSION;
    struct D {
        int NO;
        int X;
        int Y;
    } DATA[MAXCITY];
} s;
FILE *f;
int st,n,i;
char ln[MAXCPL];
int main() {
    f=fopen("data.txt","r");
    if (NULL==f) {
        printf("Can not open file data.txt!\n");
        return 1;
    }
    st=0;
    n=0;
    while (1) {
        if (NULL==fgets(ln,MAXCPL,f)) break;
        if (st==0) {
            if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;
        } else if (st==1) {
            if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;
        } else if (st==2) {
            if (0==strcmp(ln,"DATA\n")) st=3;
        } else if (st==3) {
            if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {
                n++;
                if (n>=MAXCITY || n>=s.DIMENSION) break;
            }
        }
    }
    fclose(f);
    printf("s.NAME=[%s]\n",s.NAME);
    printf("s.DIMENSION=%d\n",s.DIMENSION);
    for (i=0;i<n;i++) {
        printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);
    }
    return 0;
}
//s.NAME=[essaie bla bla]
//s.DIMENSION=8
//s.DATA[0].NO,X,Y=1,14,15
//s.DATA[1].NO,X,Y=2,11,10
//s.DATA[2].NO,X,Y=3,6,4
//s.DATA[3].NO,X,Y=4,7,13
//s.DATA[4].NO,X,Y=5,9,21
//s.DATA[5].NO,X,Y=6,19,3
//s.DATA[6].NO,X,Y=7,1,5
//s.DATA[7].NO,X,Y=8,8,8

qq_27479125 2017-05-19
  • 打赏
  • 举报
回复
引用 3 楼 qq_28163175 的回复:
[quote=引用 2 楼 qq_27479125 的回复:] 自己动动手把行号清了吧, Linux中用命令行运行 ./a.out 北极熊。
1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 int main(int argc, char *argv[])
  5 {
  6     char buf[1024];
  7     char *pstr;
  8     int offset = 0;
  9     FILE *fp = NULL;
 10     
 11     if (argc < 2) {
 12         printf("Useage: [name] \n");
 13         return -1;
 14     }   
 15     
 16     fp = fopen("./2.txt", "r");
 17     if (fp == NULL) {
 18         printf("open file error!\n");
 19         return -1;
 20     }   
 21     while (fgets(buf, sizeof(buf), fp) != NULL) {
 22         if (strstr(buf, argv[1]) != NULL) {
 23             printf("%s", buf);
 24         }   
 25     }   
 26     
 27     fclose(fp);
 28     
 29     return 0;
 30 }
大佬 ,这个我也能打印出来,但是不符合题目要求啊[/quote] 啥意思?你是想把所有信息输出为一行?那每次读的一行数据把最后一个换行替换掉啊。最后再补个换行。
自傷無色丶 2017-05-18
  • 打赏
  • 举报
回复
引用 2 楼 qq_27479125 的回复:
自己动动手把行号清了吧, Linux中用命令行运行 ./a.out 北极熊。
1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 int main(int argc, char *argv[])
  5 {
  6     char buf[1024];
  7     char *pstr;
  8     int offset = 0;
  9     FILE *fp = NULL;
 10     
 11     if (argc < 2) {
 12         printf("Useage: [name] \n");
 13         return -1;
 14     }   
 15     
 16     fp = fopen("./2.txt", "r");
 17     if (fp == NULL) {
 18         printf("open file error!\n");
 19         return -1;
 20     }   
 21     while (fgets(buf, sizeof(buf), fp) != NULL) {
 22         if (strstr(buf, argv[1]) != NULL) {
 23             printf("%s", buf);
 24         }   
 25     }   
 26     
 27     fclose(fp);
 28     
 29     return 0;
 30 }
大佬 ,这个我也能打印出来,但是不符合题目要求啊
qq_27479125 2017-05-18
  • 打赏
  • 举报
回复
自己动动手把行号清了吧, Linux中用命令行运行 ./a.out 北极熊。
1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 int main(int argc, char *argv[])
  5 {
  6     char buf[1024];
  7     char *pstr;
  8     int offset = 0;
  9     FILE *fp = NULL;
 10     
 11     if (argc < 2) {
 12         printf("Useage: [name] \n");
 13         return -1;
 14     }   
 15     
 16     fp = fopen("./2.txt", "r");
 17     if (fp == NULL) {
 18         printf("open file error!\n");
 19         return -1;
 20     }   
 21     while (fgets(buf, sizeof(buf), fp) != NULL) {
 22         if (strstr(buf, argv[1]) != NULL) {
 23             printf("%s", buf);
 24         }   
 25     }   
 26     
 27     fclose(fp);
 28     
 29     return 0;
 30 }
自傷無色丶 2017-05-18
  • 打赏
  • 举报
回复
求大佬指教,自己C语言基础太差。。求指教!

69,381

社区成员

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

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