使用fscanf读取含有数据间含有多个空格的数据

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

之前一直使用fortran处理数据

忽然发现C语言忘得差不多了

同时觉得fortran的编写规则太混乱 不利于程序开发的趋势

所以决定还是捡起C

采用C读取gulp的res文件计算径向分布函数

但是发现用fscanf(ip,"%d%lf%lf%lf"",&no,&x,&y,&z);读取类似这种数据时

   1       3.178903132     2.100312814     6.846356633

总是得不到正确的结果

后来发现网上说在格式控制后面加上*[^\n]%*c可行,一试果然可以

查询后发现完整的格式控制符应为[=%[*][width][modifiers]type=]

*号表示读取后忽略指定的数据不记录后面的变量(An optional starting asterisk indicates that the data is to be read from the stream but ignored, i.e. it is not stored in the corresponding argument.)

 

对于 const char* p = "12232114687ABC12356";
sscanf(p, "%[123]", buf); //
就把是'1''2''3'的字读读到buf中,直到遇到一个不是'1'且不是'2'且不是'3'的字符,于是执行后buf应该是"1223211";
%[123]
等同于%[231],等同于%[321]……,列表中的顺序是无所谓的;
%[123]
也等同于%[1-3]%[3-1],也就是“13”,对于连续的字符列表这样写就很简单,比如%[a-z]等同%[abc…省略…z]
想想看,%[3-14]应该等同于什么?是“314”吗?当然不是,因为[]中的是字符,而不是数字,所以%[3-14]应该等同于%[3214],等同于%[1234]
同理,想只取字母,那就可以写成%[A-Za-z]
如果列表的第一个字母是^,那么正好相反,比如%[^A-Za-z]的意思就是取字母之外的所有字符。
对于字符串"abDEc123"如果想按照字母和数字读到两个字符串中就应该是 "%[a-zA-Z]%[0-9]", buf1, buf2
假如我想取一行字符,该怎么办?"%s"是不行的,因为%s遇到空白字符(空格、制表符、\r\n)就结束了,所以可以写成"%[^\n]%*c"%[^\n]的作用刚才讲过了,就是读'\n'之外的所有字符,也就是说读到\n为止,'%*c'的作用就是把\n去掉,否则再次读的时候一直遇到的都是'\n'
所有对%s起作用的控制,都可以用于%[],比如"%*[^\n]%*c"就表示跳过一行,"%-20[^\n]"就表示读取\n20个字符。

 

我想fscanf在默认状态下应是读取到分隔符是自动停止 然后再按格式控制分配数据,

%[^\n]则强迫其读取‘\n’前的全部内容,再分配数据,因此就不会产生数据错乱的情况(待证实)

看来在编程中加入%[^\n]%*c是一个比较好的习惯

然而关于这一部分的内容

教材中却很少提及 实践出真知啊

参考

1.http://www.cnblogs.com/fangyu/archive/2011/03/29/1998605.html

2.http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

3.http://blog.chinaunix.net/space.php?uid=14121858&do=blog&id=216299

fscanf()函数从文件中读取数据时分隔符的问题        最近在做实用算法实验的时候,遇到了从文件中读取数据并存储的问题,由于之前的C语言基本上是自学并且是为了考研而学的,所以文件方面的内容知之甚少,借着这个机会重新学习了下文件部分的内容,在解决实际问题的同时,补一补知识漏洞。        文件方面的基础内容在任何一本C语言教程上面应该都能够找到,但是在涉及到实际用法的时候可能会有所偏差。        首先,要了解的是fscanf(... 阅读详情

相关推荐

C++ fscanf函数分割读取文本文件

描述 C 库函数int fscanf(FILE *stream, const char *format, ...)从流 stream 读取格式化输入,头文件是<stdio.h>, fscanf遇到空格和换行时结束。 声明 下面是 fscanf() 函数的声明。 int fscanf(FILE *stream, const char *format, ...) 参数 ...

菜鸟进阶 7852

Matlab之print,fprint,fscanf,disp函数

print: print函数可以把函数图形保存成图片: [plain] view plaincopy minbnd = -4*pi;   maxbnd = 4*pi;   t = minbnd:0.1*pi:maxbnd;   plot(t, sin(t), 'g', 'Linewidth', 2);   line([minbnd,

Ts_Coo的专栏 1万+

UG二次开发GRIP刻字

UG二次开发GRIP刻字

qq285503851的博客 1118

c fscanf 按行读取文件_Matlab中fscanf语句用法参数SizeA详解

数值如12345等可以作为字符,所以以字符格式读取文件时,这些数字照样可以被读取 A = fscanf(fileID,formatSpec) A = fscanf(fileID,formatSpec,sizeA) 以上是fscanf的语法; sizeA起到的作用是限制,限制读取读取文件中数据的数量; 举例来说: John 1995 12 5 12.3 3.24 Tom 1995 12 7 ...

weixin_39603469的博客 456

文件读取读取空格字符串的问题

实际工作中,碰到如何读取空格字符串的问题,记录如下: 我用的FILE文件对象,使用fscanf来读内容,文件是一个txt文件,每一行要么是数字,要么是汉字或者英文,都是有规律的。 所以,可以用fscanf(file,"%d"...)来读取,没有问题。 之前我用fscanf(file,"%s"....)读取字符串的时候,不论是汉字或者是英文,如果字符串是连续的,也没有问题。 但是,碰到了带空格字符串,如"hello world"而不是"helloworld"时,我需要把这一行的字符串都读出来当.

wzxiaodu的专栏 2263

FORTRAN 输入输出 from《Fortran95 程序设计》

输出例子:  PROGRAM EX04220 INTEGER A A=1000 WRITE(*,100) A 100 FORMAT(I4) END100 FORMA(I4) 是格式化输出,常用的格式化输出包括:Aw     字符串,w个字符来输出;            Iw[.m] w个宽度输出整数,最少输出m个数字;Ew.d  用指...

qlj061001的博客 1753

fscanf函数的用法

fscanf函数用法 简要介绍 fscanf()函数是格式化读写函数。它读取的对象是磁盘文件 函数原型: int fscanf(FILE * fp,char * format,...); 其中fp为文件指针,format为C字符串,...为参数列表,返回值为成功写入的字符的个数。 fscanf函数会从文件输入流中读入数据,存储到format中,遇到空格和换行时结束。 使用示例 #incl...

Lindong2016的博客 2万+

C语言读取文件(二)——fscanf 详谈

原创: hxj7 fscanf 函数用于格式化读入文件中数据,可以大大提高读取文件的效率。这次笔者将最近使用该函数的一些经验记录下来。 第一部分:问题和结论 fscanf 函数的原型是: int fscanf(FILE* stream, const char* format, [argument...]); fscanf 函数与 scanf 函数用法类似,只不过前者用于读取文件流的数据而已。...

生信了 6万+

C语言 认识转换符 fscanf()用法

1 原型 int    fscanf(FILE *stream,  const  char* format, …) 功能:    从stream流中读取能够匹配format格式的数据到参数列表中对应的变量里。 参数:    “stream”是FILE指针类型变量,它指向一个真实的流对象。 “format”是C字符串,由“空格”、“非空格”及“特定格式”组成。 “…”是与“format”中

记一忘三二 5万+

c++文件读取空格_C语言读取文件(二)——fscanf 详谈

原创: hxj7 fscanf 函数用于格式化读入文件中数据,可以大大提高读取文件的效率。这次笔者将最近使用该函数的一些经验记录下来。第一部分:问题和结论fscanf 函数的原型是:int fscanf(FILE* stream, const char* format, [argument...]);fscanf 函数与 scanf 函数用法类似,只不过前者用于读取文件流的数据而已。至于 fsca...

weixin_42349978的博客 2768

c语言fscanf读入字符串,fscanf读取多行 怎么用fscanf读入文件下一行

python+django MTV框架 和php MVC框架的不同之处后来当朋友再问起小编你还那么喜欢他吗,小编终于可以低头微笑摇着头说不了。您教导小编们不要说废话,可在小编眼里您说的全是废话!python+django MTV框架 和php MVC框架的不同之处 最近学习了python语言和djangoMTV框架,感觉用的很爽埃这里给大家粗略的介绍一下。 Django是一个开放源代码的Web应用...

weixin_39937524的博客 7223

fscanf 跳过空格读取一行

fscanf(fp, "%s", sLineWord); 以上语句,在读取一行数据时,如何遇到该行数据空格,那么读到空格处就停止,不再继续向下读。 若想遇到空格继续读取读取完整的一行数据,则用如下语句fscanf(fp, "%[^\n]%*c", sLineWord);

Jiwei的专栏 2万+

matlab fscanf无法读入空格,C语言fscanf()函数读空格的问题解决办法

fscanf()函数是C语言中的文件格式化读取函数,其使用空格、Tab、回车来分割不同单词,使用起来比较方便。在C语言中的文件格式化读写函数:fprintf和fscanf中我们介绍了fscanf函数,并给出了示例程序,本文也将在该程序的基础上进行解说。在示例程序中,我们定义了一个结构体类型student,用于保存学生的信息(学号、姓名和三门课的成绩),写入到文件中就是下面这个样子:1 letukn...

weixin_29705519的博客 1779

C语言fscanf读取的是一行吗,C语言中fgets和fscanf区别详解

C语言中fgets和fscanf区别详解发布时:2020-09-02 22:06:02来源:脚本之家阅读:86作者:CSDN_LQRC语言中fgets和fscanf区别详解一、作用上的大概区别:①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往缓冲区写多一个\0,所以它是读一行数据)②fscanf:从文件中读取一段数据存入...

weixin_35886269的博客 2783

关于fprintf和fscanf的详细使用方法

关于fscanf和fprintf格式化读写文件的总结 1. fscanf和fprintf的函数原型 int fscanf ( FILE *fp, char * format, ... ); int fprintf ( FILE *fp, char * format, ... ); 第一个参数:文件指针 第二个参数:就是格式控制字符串,比如说"%d" 表示十进制输出,"%c"表示单个字符值,%s对...

凝望,划过星空的博客 5573

按格式化方式读取文件------fscanf函数

简介: fscanf()函数是格式化读写函数。它读取的对象是磁盘文件 函数原型: int fscanf(FILE * fp,char * format,…); 其中fp为文件指针,format为C字符串,…为参数列表,返回值为成功写入的字符的个数。 fscanf函数会从文件输入流中读入数据,存储到format中,遇到空格和换行时结束。 注意:fscanf和sscanf有同样的用法 1、fscanf函数在文件输入流中读取数据时,遇到空格或者换行会结束读取,如果要忽略空格的影响,可以使用 fscanf(fp

m0_53157173的博客 1万+

fscanf遇到空格停止?读取空格字符串技巧

在处理C语言文件输入时,fscanf函数对空格的处理方式是许多开发者容易困惑的地方。正确理解这一特性对于准确读取结构化数据至关重要,特别是在处理包含空格字符串时

2509_93883384的博客 431

c语言fscanf读取不了电脑txt文件,C语言读取文件(二)fscanf 详谈

fscanf 函数用于格式化读入文件中数据,可以大大提高读取文件的效率。这次笔者将最近使用该函数的一些经验记录下来。fscanf 函数的原型是:int fscanf(FILE* stream, const char* format, [argument...]);(至于信号灯,事件的用法我们接下来会讲)我们在前面的例子中使用了waitformultipleobjects 函数,这个函数的作用与 w...

weixin_29505163的博客 3362

C/C++分别读取文件,以空格为分隔符

C语言: #include #include #include string.h> int main(int argc, char* argv[]) { int count = 0; FILE* fp; char str[100]; fp = fopen("test.txt", "r"); while (fscanf(fp, "%s", s

baidu_36137891的博客 2万+
上一篇: 从今天开始
下一篇: 没有简单的事
frankeyshuo
博客等级 码龄19年 0粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值