一个读文件的函数,头都晕了,请指点下?

whizstorm 2005-10-22 10:41:00
文件格式如下:
:xxx\n
>YYY F F\n
>YYYY F F\n
.
.
:xxx\n
>YYY F F\n
...
:后是一个字符串,记录某个样本名,\n表示回车,由fprintf(pf, ":%s\n", sMb);生成
>表示属性名,F表示浮点树,两个数之间有空格,由fprintf(pf,">%s %0.3f %0.3f\n", sMbz,f1,f2);生成的.属性的条数不确定的,可能没有最多10条,现在要写个函数,找到与XXX对应的属性,并读出来.

我写函数
int ReadInfoFromFile(const char* file_name,const char smbzl,char SCR[][])
{
FILE *fp = fopen(mid_file_name,"rb");
if(fp==NULL) return 0;
int elements = 0;
long pos = ftell( fp );
char cmd[81];
int i;
float sim1,sim2;
while(1)
{
int c = fgetc( fp );
if(c == ':')
{
fscanf( fp, "%s/n",cmd);
if(0 == strcmp(smbzl,cmd))
{
do
{
c = fgetc( fp );
if(c=='>')
{fscanf(fp,"%s %f %f\n",SCR[i],sim1,sim2);i++;}
}
while(c==':'||c==EOF);
}
else if (c == EOF) break;
}
}
fclose(fp);
return 1;
}
都晕了,请高手指点下!
...全文
204 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocai0001 2005-10-23
  • 打赏
  • 举报
回复
fscanf( fp, "%s/n",cmd);
把你fscanf()格式串中的\n都去掉看看行不行
whizstorm 2005-10-23
  • 打赏
  • 举报
回复
文件的具体数据如下:

:112
:1121
>1122 0.967 0.966
>1123 0.967 0.966
:1122
>1121 0.966 0.967
>1123 1.000 1.000
>1121 0.966 0.967
>1122 1.000 1.000
.
.
.
xiaocai0001 2005-10-23
  • 打赏
  • 举报
回复
被 你的文件格式给弄晕了
wuwen19 2005-10-23
  • 打赏
  • 举报
回复
你按照这个模式试一下,

1.txt 文本如下,
:112
:1121
>1122 0.967 0.966
>1123 0.967 0.966
:1122
>1121 0.966 0.967
>1123 1.000 1.000
>1121 0.966 0.967
>1122 1.000 1.000


程序
#include "stdio.h"

main()
{
FILE *fp;

struct {
char buf[1024];
char buf1[1024];
char buf2[1024];
char buf3[1024];
}t_s ;


if ( ( fp=fopen("1.txt","r") ) == NULL )
{
printf("fopen 1.txt error!\n");
return;
}

memset(&t_s,0x00,sizeof(t_s));
while ( fgets(t_s.buf,sizeof(t_s.buf),fp) != NULL )
{
t_s.buf[strlen(t_s.buf) - 1] = 0;

printf("t_s.buf = <%s>\n",t_s.buf);
printf("t_s.buf[0] = <%c>\n",t_s.buf[0]);

if ( t_s.buf[0] == ':' )
{
sscanf(t_s.buf+1,"%s",t_s.buf1 );
printf("t_s.buf1 = <%d>\n",atoi(t_s.buf1));
}
else if ( t_s.buf[0] == '>' )
{
sscanf(t_s.buf+1,"%s%s%s",t_s.buf1,t_s.buf2,t_s.buf3);
printf("t_s.buf1 = <%d>\n",atoi(t_s.buf1));
printf("t_s.buf2 = <%.2f>\n",atof(t_s.buf2));
printf("t_s.buf3 = <%.2f>\n",atof(t_s.buf3));
}

memset(&t_s,0x00,sizeof(t_s));
}

fclose(fp);
return;
}


看看能不能达到你的要求。
printf部分你可以自己改成你自己要实现的东西。
jixingzhong 2005-10-23
  • 打赏
  • 举报
回复
可以考虑把
fscanf()
换成
sscanf() ...
steel007 2005-10-22
  • 打赏
  • 举报
回复
你一行一行的读,然后再parse
fiftymetre 2005-10-22
  • 打赏
  • 举报
回复
mark,我也晕了

69,371

社区成员

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

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