我想用这些字段将这样的文件解析为整数和浮点变量,我试图用fscanf,strtok,sscanf来做这个。但它们都不起作用!
文件的某些行:
fed18 5.7 12.7 144997 8087 267345 100776
fedora18 24.9 25.3 253566 10501 126282 118157
fed18 5.9 12.7 145005 8094 267345 100785
fedora18 23.3 25.3 253576 10507 126282 118169
fed18 6.2 12.7 145013 8100 267345 100789
运行以下代码会返回错误的值!在我搜索时,我不知道问题是什么,每个人都使用这样的代码,并且它适用于他们!
while(fgets(str,512,fp)!= NULL)//read file line by line
{
char *tokenstring = str;
uint64_t netrx,nettx,vbd_rd,vbd_wr;
double cpu, mem;
char a[10],b[10],c[10],d[10],e[10],f[10],g[10];
sscanf(tokenstring, "%s ,%[^' '],%[^' '],%[^' '],%[^' '],%[^' '],%[^' ']",g, a, b, c, d, e, f);
cpu = atof(a);
mem = atof(b);
nettx = atoi(c);
netrx = atoi(d);
vbd_rd = atoi(e);
vbd_wr = atoi(f);
printf("%s %f %f %ld %ld %ld %ld\n",g,cpu,mem,netrx,nettx,vbd_rd,vbd_wr);
}
fclose(fp);
这是输出:
fed18 38.000000 1.000000 0 0 0 0
fedora18 38.000000 1.000000 0 0 0 0
fed18 38.000000 1.000000 0 0 0 0
fedora18 38.000000 1.000000 0 0 0 0
fed18 38.000000 1.000000 0 0 0 0
我使用bash脚本编辑原始文本文件并使用awk
,....
原始行采用以下格式:
fed18 --b--- 3616 6.3 1052640 12.7 1052672 12.7 3 1 125864 6023 1 0 254349 93082 7412662 4730752 0
fedora18 --b--- 4711 2.4 2101216 25.3 2101248 25.3 3 1 249151 8636 1 0 126083 113505 3306934 5992656 0
我使用bash脚本选择了一些列。 也许这引起了问题!
我评论了使用函数atoi
或atof
但仍输出错误值的行。
答案 0 :(得分:2)
您的格式字符串包含输入中不存在的逗号。也就是说,您应该使用%lf
将浮点数解析为double
和%lu
以解析为uint64_t
。
请注意,当前语言环境不是英语时可能会遇到麻烦,因为这会影响C所需的字符作为小数点。使用setlocale(LC_NUMERIC, "C");
来解决此问题。
答案 1 :(得分:2)
如果您总是期望参数之间只有一个空格,那么您可以简单地使用格式字符串,而无需atoi
,atof
:
while(fgets(str,512,fp)!= NULL)//read file line by line
{
char *tokenstring = str;
uint64_t netrx,nettx,vbd_rd,vbd_wr;
char g[10];
double cpu, mem;
long int c, d, e, f;
sscanf(tokenstring, "%s %lf %lf %lu %lu %lu %lu", g, &cpu, &mem, &nettx, &netrx, &vbd_rd, &vbd_wr);
printf("%s %f %f %ld %ld %ld %ld\n",g,cpu,mem,netrx,nettx,vbd_rd,vbd_wr);
}
fclose(fp);
答案 2 :(得分:1)
scanf旨在解析数字,因此无需使用atoi
,因此只需使用带有适当参数的sscanf
int result = sscanf(tokenstring, "%s %lf %lf %lld %lld %lld %lld",g, &cpu, &mem, &netrx, &netrx, &vbd_rd, &vbd_wr);
assert( result == 7 ) ;