读取文件数据,该如何解决

读取文件数据
现在我的文件大致是如下图这种类型的。
读取文件数据,该如何解决
这现在的分行是我用了fprintf(fp,"\r\n"); 直接分行的。

现在问题是这样的。
比方说第一行数据,第一步,我首先要找到“!” 再找到"#", 那么中间的就是一个名字,找到感觉挺好搞的,可是怎么把中间的名字拿出来,我一直没搞清白。。
第二步,在上面的动作完了之后,需要 读取“#”后面的那个一长串字符串。
第三步,顺序读完整个文件的全部数据,分条读出来。。

求教了。。或者给个demo我看看也行。。


------解决方案--------------------
作为一个C程序员,对
 scanf,sscanf,fscanf
 printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。
读取文件数据,该如何解决
//in.txt
//!矩阵#fe 00 01 01 01 00 01 ff
//!高速球$ff 01 00 20 00 00 21
//!画面分割器*a5 6c 15 00 81 00 01 00 00 00 00 00 00 00 00 00 18 01 c1 01 ae
#include <stdio.h>
char ln[600];
char nm[30];
FILE *f;
char b[200];
char *p,c;
int i,r,n,v,L;
int main() {
    f=fopen("in.txt","r");
    if (NULL==f) {
        printf("Can not open file in.txt!\n");
        return 1;
    }
    L=0;
    while (1) {
        if (NULL==fgets(ln,600,f)) break;
        L++;
        r=sscanf(ln,"!%29[^#$*]%c%n",nm,&c,&n);
        if (2==r && ('#'==c 
------解决方案--------------------
 '$'==c 
------解决方案--------------------
 '*'==c)) {
            p=ln+n;
            i=0;
            while (1) {
                r=sscanf(p,"%2x%n",&v,&n);
                if (1==r) {
                    b[i]=(char)v;
                    i++;
                    if (i>=200) break;
                    p+=n;
                } else if (0==r) {p++;} else break;
            }
            printf("%s%c",nm,c);
            n=i;
            for (i=0;i<n;i++) printf("%02x ",(unsigned char)b[i]);
            printf("\n");
            continue;
        }
        printf("Line %d Format Error:%s",L,ln);
    }
    fclose(f);
    return 0;
}
//矩阵#fe 00 01 01 01 00 01 ff
//高速球$ff 01 00 20 00 00 21
//画面分割器*a5 6c 15 00 81 00 01 00 00 00 00 00 00 00 00 00 18 01 c1 01 ae
//

------解决方案--------------------
我根据自己的理解做了一下,不知跟楼主需要的是否一致:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define TTLSIZE 81  //读入文件中每个字符串的总长限定
#define STRSIZE 61  //读入#等字符之后的字符串的长度限定
#define MAX 21  //读入!之后的中文字符串的长度限定
#define NUM  3  //文件中字符串的数目

struct strings
{
char head;         //装载!
char name[MAX];    //装载!之后的中文字符串
char contrlch;     //装载名字之后的那个字符#, $以及*
char str[STRSIZE]; //装载#等字符之后的字符串
};                     //用结构体装载字符串的不同部分

int main(void)
{
struct strings strs[NUM];
int i = 0;
char * pstring, * pname, * pstr;
char string[NUM][TTLSIZE]; //用以整个读取文件中的3个字符串
char ctrlch[NUM] = {'#', '$', '*'};
FILE * fp;

if((fp = fopen("data.txt", "r")) == NULL)
{
fputs( "Error reading file.", stderr);
exit(EXIT_FAILURE);
}
while(i < NUM && fgets(string[i], TTLSIZE, fp) != NULL && string[i][0] != '\n')