vc里读文件问题

LBJMD 2011-02-24 08:59:55
1,12454.1119386692,14243.9652902222,344.401538932887,43, 55,34
2,。。。
3,。。。


在MFC里怎么把上面格式的文件读入到定义的x,y,z,m,n,q变量中,由于行数比较多,要求尽可能以比较高的效率来读。


...全文
123 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-02-24
  • 打赏
  • 举报
回复
CStdioFile::ReadString()然后解析数据CString::Tokenize();
yuucyf 2011-02-24
  • 打赏
  • 举报
回复
用sscanf.

1. 常见用法。
char buf[512] = ;
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);

结果为:123456

2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);

结果为:1234

3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);

结果为:123456

4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);

结果为:123456abcdedf

5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);

结果为:123456abcdedf

6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);

结果为:12DDWDFF

7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);

结果为:world

%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

如果没有空格则结果为NULL。

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.得到结果。
zhanshen2891 2011-02-24
  • 打赏
  • 举报
回复
按行读啊,一次处理一行
LBJMD 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wkq87 的回复:]
根据文件格式来吧,先读在内存里,然后由文件格式标记Find()找到后进行分离就可以了
[/Quote]
调用函数分隔的话效率会受影响,文本行数太多了,有几百万行
wkq87 2011-02-24
  • 打赏
  • 举报
回复
根据文件格式来吧,先读在内存里,然后由文件格式标记Find()找到后进行分离就可以了
vnking 2011-02-24
  • 打赏
  • 举报
回复
还是自己解析文件格式吧,你的数据你做主。
见习学术士 2011-02-24
  • 打赏
  • 举报
回复

CFile file;
if( !file.Open( pFilePath, CFile::modeRead ) )
return false;
CArchive ar(&file,CArchive::load);
CString strBuf;
while (ar.ReadString(strBuf))
{
sprintf("%s",strBuf);
}
ar.Close();
file.Close();

LBJMD 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 king_hhuang 的回复:]
问题在这句
ar>>index>>x>>y>>z>>r>>g>>b;
[/Quote]
怎么个问题啊,格式不对吗
King_hhuang 2011-02-24
  • 打赏
  • 举报
回复
问题在这句
ar>>index>>x>>y>>z>>r>>g>>b;
LBJMD 2011-02-24
  • 打赏
  • 举报
回复
CFile file("1.txt",CFile::modeRead);
CArchive ar(&file,CArchive::load);
float index;
double x,y,z;
int r,g,b;
CString str;
ar>>index>>x>>y>>z>>r>>g>>b;
这个有点问题,不知道出在哪
King_hhuang 2011-02-24
  • 打赏
  • 举报
回复
看看这个
http://topic.csdn.net/u/20110218/12/e039e736-ca2f-4168-b06a-14d386d511c5.html?52152
LBJMD 2011-02-24
  • 打赏
  • 举报
回复
读的时候前面的序号1,2,3,等等不用读了,就是把后面的值读到变量里

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧