首先让我问你的原谅,如果这太琐碎了,我不是C开发人员,通常我在Fortran编程。C语言阅读专栏文本文件
我需要阅读一些专栏文本文件。我遇到的问题是一些列可以有空格(非填充值)或不完全填写的字段。
让我用一个简短的问题例子。比方说,我有一个生成器程序,如:
#include
#include
int main(){
printf("xxxx%4d%4.2f\n",99,3.14);
}
当我执行这个节目,我得到:
$ ./t1
xxxx 993.14
如果我把它变成一个文本文件,并尝试使用(例如)sscanf的与阅读代码:
#include
#include
int main() {
char *fmt = "%*4c%4d%4f";
char *line = "xxxx 993.14";
int ival;
float fval;
sscanf(line,fmt,&ival,&fval);
printf(">>>>%d|%f\n",ival,fval);
}
结果是:
$ ./t2
>>>>993|0.140000
这里有什么问题? sscanf似乎认为所有空间都是毫无意义的,应该丢弃。因此,“%4c”完成了它的功能,它计算4个字符而不会丢弃任何空格,并丢弃由于“”而导致的所有内容。接下来,%4d开始跳过所有空格,并在找到转换的第一个有效字符时开始计算字段的4个字符。所以99的值就是993,3.14的值是0.14。
在Fortran中读取代码将是:
program t3
implicit none
integer :: ival
real :: fval
character(len=30) :: fmt="(4x,i4,f4.0)"
character(len=30) :: line="xxxx 993.14"
read(line,fmt) ival, fval
write(*,"('>>>>',i4,'|',f4.2)") ival,fval
end program t3
,结果将是:
$ ./t3
>>>> 99|3.14
也就是说,格式规范状态字段宽度,并没有什么在转换丢弃,除了如果按照“nX”规范指示。
一些最后发言,以帮助助手:
要读取的格式是国际标准并没有改变它 方式。
现有文件的数量是要考虑干预或 格式更改。
它不是CSV或类似的格式。
该代码必须在C中,以便集成到免费软件包中。
对不起,太长了,试图尽可能完整地说明问题。
问题是:有没有办法告诉sscanf不要跳过空格?如果没有,是否有一个简单的方法在C中完成它,或者有必要为每个记录类型编写一个专门的解析器?
预先感谢您。
2016-01-06
Roxo
+0
您在使用strtok的考虑()? –
+0
是的,我考虑过了。根据手册,它是一个将字符串分解为零或多个非空令牌序列的函数。问题是文件的每一行都有一个(〜10)列字段,并不是所有的字段都被保证填写,字段之间没有分隔符。我需要读取每一行,并根据它们的长度和种类(int,float或double)提取所需的字段。空白字段必须读为零。 –