我想从空格分隔的文本文件中扫描形成向量的变量,而绊脚石(对我来说经常如此)缺乏优雅。
目前我的扫描代码需要将向量的大小描述为文件中的第一个元素:
7 : 1 3 6 8 -9 .123 1.1
这让我很困扰,因为“7”可以通过检查空白来确定。
我尝试了各种形式的 fscanf()、strtok() 等,但似乎都是蛮力的。如果不求助于 lex/yacc(不可用),有人可以提出比以下更优雅的建议吗?
typedef struct vector_tag
{
int Length;
double * value;
} vector;
vector v;
char buf[BIG_ENOUGH], key[BIG_ENOUGH], val[BIG_ENOUGH];
void scan_vector(FILE * fh)
{
int i, length;
double * data;
char * tok;
do {
if (feof(fh)) return;
fgets(buf, sizeof buf, fh);
} while (2 != sscanf(buf,"%[^:]:%[^\n\r]",key,val));
length =
v.Length = strtol(key,NULL,10);
data =
v.value = malloc(length * sizeof(double));
tok = strtok(val, " "); /* I'd prefer tokenizing on whitespace */
for (i = 0; i++ < v.Length; ) {
* data++ = strtod(tok,NULL);;
tok = strtok(NULL, " "); /* Again, tokenize on whitespace */
}
}
解决方案:感谢检查的答案,我实现了:
static int scan_vector(FILE * fh, vector * v)
{
if (1 == fscanf(fh,"%d:",& v->length))
{
int i;
v->value = malloc(v->Length * sizeof(double));
assert (NULL != v->value);
for (i = 0; i < v->Length; i++)
{
if (fscanf(fh,"%lf",v->value + i) != 1) return(0);
}
return(1);
}
return(0);
} /* scan_vector() */