读取文件数据,该如何解决
读取文件数据
现在我的文件大致是如下图这种类型的。

这现在的分行是我用了fprintf(fp,"\r\n"); 直接分行的。
现在问题是这样的。
比方说第一行数据,第一步,我首先要找到“!” 再找到"#", 那么中间的就是一个名字,找到感觉挺好搞的,可是怎么把中间的名字拿出来,我一直没搞清白。。
第二步,在上面的动作完了之后,需要 读取“#”后面的那个一长串字符串。
第三步,顺序读完整个文件的全部数据,分条读出来。。
求教了。。或者给个demo我看看也行。。
------解决方案--------------------
作为一个C程序员,对
scanf,sscanf,fscanf
printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。

------解决方案--------------------
我根据自己的理解做了一下,不知跟楼主需要的是否一致:
现在我的文件大致是如下图这种类型的。
这现在的分行是我用了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')