📄 sscanf.txt
字号:
sscanf(str, "%d,%d%,%d,%d ",&a,&b,&c,&d);
C/C++ code
Example/* FGETS.C: This program uses fgets to display * a line from a file on the screen. */#include <stdio.h>
void main( void )
{
FILE *stream;
char line[100];
if( (stream = fopen( "fgets.c", "r" )) != NULL )
{
if( fgets( line, 100, stream ) == NULL)
printf( "fgets error\n" );
else
printf( "%s", line);
fclose( stream );
}
}
Output/* FGETS.C: This program uses fgets to display
Treazy 2007-11-8 13:28:13 得分:20 转到顶部
FILE *fopen(char *filename, char *mode);打开一个文件
int fclose(FILE *fp);关闭文件
int fread(void *buf, int size, int count, FILE *fp);
从文件的当前位置开始中读取size*count个字节的数据
int fwrite(void *buf, int size, int count, FILE *fp);
往文件的当前位置开始写入size*count个字节的数据
int fseek(FILE *fp, LONG offset, int origin);
设定文件操作指示器位置
yvhkpgf 2007-11-8 13:34:33 得分:0 转到顶部
不过数据量有点大呢,大概有10W左右的量,这些也可以吗?
还有可以解释一下怎么把每行中的数据提取出来吗?小菜鸟,大虾们多多指教哈
Treazy 2007-11-8 13:41:35 得分:0 转到顶部
不过数据量有点大呢,大概有10W左右的量,这些也可以吗?
还有可以解释一下怎么把每行中的数据提取出来吗?小菜鸟,大虾们多多指教哈
---------------------------------------------------------------
char *fgets(char *str, int num, FILE *fp);读一行字符,该行的字符数不大于num-1
yvhkpgf 2007-11-8 13:42:56 得分:0 转到顶部
刚刚看了一下数据,每行数据不是完全的整齐,有些可能会多一两个字节,有的要少点点
Treazy 2007-11-8 13:49:04 得分:0 转到顶部
刚刚看了一下数据,每行数据不是完全的整齐,有些可能会多一两个字节,有的要少点点
-----------------------------------------------------------------
char *fgets(char *str, int num, FILE *fp);读一行字符,该行的字符数不大于num-1
该函数的参数num是个最大值的判断,当遇到一行数据大于num-1时,自动加入结束
若小于num-1则读到换行符就直接将数据存入str
所以你的没行数据多少无所谓
只要知道最长那行是多少,令num大于它就可以了!
yvhkpgf 2007-11-8 13:57:48 得分:0 转到顶部
喔,谢谢达人们哈,收获不小
sscanf
sscanf,表示从字符串中格式化输入
上面表示从str中,输入数字给x,就是32700
久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。
sscanf是一个运行时函数,原形很简单:
int sscanf(
const char *buffer,
const char *format [,
argument ] ...
);
它强大的功能体现在对format的支持上。
我以前用它来分隔类似这样的字符串2006:03:18:
int a, b, c;
sscanf("2006:03:18", "%d:%d:%d", a, b, c);
以及2006:03:18 - 2006:04:18:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
但是后来,我需要处理2006:03:18-2006:04:18
仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。
我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。
format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
%[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。
所以那个问题也就迎刃而解了:
sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);
在softmse (Jake) 的问题贴http://community.csdn.net/Expert/topic/4843/4843294.xml?temp=.4321558中,周星星给出了一个很cool的sscanf用例,而后通过学习,发现sscanf真棒,现做一总结。
原问题:
iios/12DDWDFF@122
获取/和@之间的字符串怎么做
C程序里面有什么函数吗?
周星星的代码:
#include <stdio.h>
int main()
{
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
return 0;
}
结果为:12DDWDFF
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
函数原型:
int scanf( const char *format [,argument]... );
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号},
注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
width:宽度,一般可以忽略,用法如:
const char sourceStr[] = "hello, world";
char buf[10] = ;
sscanf(sourceStr, "%5s", buf); //%5s,只取5个字符
cout << buf<< endl;
结果为:hello
{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
type :这就很多了,就是%s,%d之类。
特别的:
%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:
const char sourceStr[] = "hello, world";
char buf[10] = ;
sscanf(sourceStr, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
cout << buf<< endl;
结果为:world
支持集合操作:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
是不是感觉眼熟了啊,不错,这和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z].如:
星星大哥例子回顾:
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中,cool.得到结果。
PS: 向星星大哥和softmse (Jake) 致谢了,有了你们才有它啊
int scanf(const char *format, arg_list)
arg_list 要输入的参数变量列表,多个变量以逗号分隔
format 参数输入的格式,定义格式为:
%[flags][width][.perc] [F|N|h|l]type
规定数据输入方式,具体如下:
1.type 含义如下:
d 有符号10进制整数
i 无符号10进制整数
o 有符号8进制整数
u 无符号8进制整数
X/x 无符号16进制整数
F/f 浮点数
E/e 用科学表示格式的浮点数
g 使用%f和%e表示中的较精确者来表示浮点数
G 同g格式,但表示为指数
c 单个字符
s 字符串
% 输入百分号本身
p 输入一个指针,near指针表示为:XXXX
far 指针表示为:XXXX:YYYY
n 相连参量应是一个指针,其中存放已写字符的个数
2.flags 规定输入格式,取值和含义如下:
无 右对齐,左边填充0和空格
+ 左对齐,右边填充空格
- 在数字前增加符号 + 或 -
一个空格 只对负数输入符号
# 当type=c,s,d,i,u时没有影响
type=o,x,X时,在数值前增加'0'字符
type=e,E,f时,总是使用小数点
type=g,G时,除了数值为0外总是显示小数点
3.width 用于控制输入数值的宽度,取值和含义如下:
n(n=1,2,3...) 宽度至少为n位,不够以空格填充
0n(n=1,2,3...) 宽度至少为n位,不够左边以0填充 *
格式列表中,下一个参数还是width
4.prec 用于控制小数点后面的位数,取值和含义如下: 无 按缺省精度显示 .0
当type=d,i,o,u,x时,没有影响
type=e,E,f时,不显示小数点 .n(n=1,2,3...)
当type=e,E,f时表示的最大小数位数
type=其他,表示显示的最大宽度 .*
格式列表中,下一个参数还是width
5.F|N|h|l 表示指针是否是远指针或整数是否是长整数
F 远指针
n 近指针
h 短整数或单精度浮点数
l 长整数或双精度浮点数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -