⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sscanf.txt

📁 从文件的当前位置开始中读取size*count个字节的数据
💻 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 + -