C++-fscanf格式化字符串的问题求教

C++-fscanf格式化字符串的问题求教

虐人心 发布于 2017-06-16 字数 241 浏览 1275 回复 2
    while( !feof( fp ) )
{
*s = 0;
fscanf( fp, "%100[^n#]s", s );
fscanf( fp, "%*[^n]s" );
fgetc( fp );
printf("%sn", s);
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

瑾兮 2017-09-20 2 楼

1.fscanf( fp, "%100[^n#]s", s );
[^] 读取数据但不允许中括号的^符号后的字符出现,遇到时会终止。如[^0-9].
2.fscanf( fp, "%*[^n]s" );
对读取的数据不做处理,直接忽略。否则需要指定另外的参数,保存数据。
参考:

The %*c specifier says to read in a character (c), but don't assign it to any variable (*). If you omitted the *, you would have to pass fscanf() another parameter containing a pointer to a character (a char*), where it would then store the resulting character that it read in.

清晨说ぺ晚安 2017-08-28 1 楼

int fscanf(FILE *stream, const char *format, ...);

第二个参数表示的是格式,一般我们用的就是%d,%s这种简单的,但是对于format来说(sscanf,scanf也是用),也可以写成正则表达式。
对于正则表达式,fscanf的类型主要由常见的正则[],[^]。还有一些其他没有的“数字”,%*s等。举几个例子吧:
1、[a-z]简单的,表示匹配a到z的任一字符
2、[^13]表示匹配不是1和3的字符
3、%*s表示匹配字符串,但不读入到缓存里
4、%100s,表示只匹配长度为100的字符串
好了,说了几个常用的,还有{h|l}什么的表示字节长度的,此题没有就省略了,你可以查查相关资料。说到这里,应该已经感觉差不多了。那就来逐字逐句解释一下吧~以字符串adfdaf#dfjad为例
1、

  *s = 0;

我不明白。。。我一般定义不会这样,我会定义成

 char s[1000];

之类的,这样很可能报错啊。
2、

  fscanf( fp, "%100[^n#]s", s );

表示取字符串,该字符串满足长度少于100(少于100我就不举例了- -太长了)并且末尾不为回车或者#。取到s里面就是adfdaf,指针指到了#号。
3、

  fscanf( fp, "%*[^n]s" );

表示取字符串,直到回车为止,但是不存在缓存里,所以没有参数,有的话也没什么,不过编译器会警告。此时读完了此行,文件指针指在了回车上。
4、这个好说。。读一下回车而已,文件指针指在下一行的第一个字符上
5、输出。。。。。
循环内部解释完了。这个功能一下就清晰了。。表示的是:
输出文件中每行在#之前的并且长度小于100的字符串。
PS:好久没有文件读写了,查了一下正则的含义,嘿嘿