| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5321 人关注过本帖
标题:c++如何读取包含多列不同类型数据的txt文件
只看楼主 加入收藏
lebronze
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-5-25
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:9 
c++如何读取包含多列不同类型数据的txt文件
txt文件格式如下:

score1 11.2 score2 10.1
score3 11.2 score4 10.1
score5 11.2 score6 10.1
...          ....
就是字符串 空格 数字的形式,总行数不定。
想要实现的是读入txt中的各列数字到数组中,并进行排序。
只是不知道怎么读
用ifstream + getline只能把每行读成一个字符串,不能直接读到数组中
这个有没有比较成熟的方法?
搜索更多相关主题的帖子: c++ 类型 数据 txt 文件 
2018-06-28 14:09
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
听不懂

“读入txt中的各列数字到数组中”
------ 以你给了数据为例,你想得到 double[]{ 11.2, 10.1, 11.2, 10.1, 11.2, 10.1 } 吗?

“并进行排”
------ 以你给了数据为例,你想得到 double[]{ 10.1, 10.1, 10.1, 11.2, 11.2, 11.2 } 吗?
2018-06-28 14:48
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
score1 11.2 score2 10.1
score3 11.2 score4 10.1
score5 11.2 score6 10.1
...          ....
就是字符串 空格 数字的形式,总行数不定。
你说格式是“字符串 空格 数字”,可是你给的例子却都是“字符串 空格 数字 字符串 空格 数字”形式,不知道你到底那句是真话。

2018-06-28 14:51
lebronze
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-5-25
收藏
得分:0 
回复 3楼 rjsp
不好意思,没表达清楚。
我的目的是:

输入:txt文件,格式如下
score1 1 score2 2
score3 3 score4 4
score5 5 score6 6
...         ...

输出:取出txt中的第2,4列,存入数组中
      数组1={1,3,5,...};
      数组2={2,4,6,...};

需要注意的是原txt的行数是不固定的,也就是数组1,2的长度事先是不知道的。

不知道这样的表达能明白吗
2018-06-28 15:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:20 
回复 4楼 lebronze
为什么你一开始的示例数据中是浮点类型,这次又都是整型?

程序代码:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;

int main( void )
{
    // 打开文件
    ifstream fin( "d:\\a.txt" );
    if( !fin )
        return 1;

    vector<double> sb, sd;
    {
        // 读入数据
        string a, c;
        for( double b,d; fin>>a>>b>>c>>d; )
        {
            sb.push_back(b);
            sd.push_back(d);
        }

        // 排序
        sort( sb.begin(), sb.end() );
        sort( sd.begin(), sd.end() );
    }

    // 输出
    cout << "array1 = ";
    copy( sb.begin(), sb.end(), ostream_iterator<double>(cout," ") );
    cout << '\n';
    cout << "array2 = ";
    copy( sd.begin(), sd.end(), ostream_iterator<double>(cout," ") );
    cout << '\n';

    return 0;
}

假如你觉得那两个string没必要浪费空间读取,可以
程序代码:
#include <iostream>
#include <fstream>
#include <vector>
#include <limits>
#include <algorithm>
#include <iterator>
using namespace std;

int main( void )
{
    // 打开文件
    ifstream fin( "d:\\a.txt" );
    if( !fin )
        return 1;

    // 读入数据
    vector<double> sb, sd;
    {
        for( double b,d; ((fin>>ws).ignore(numeric_limits<streamsize>::max(),' ')>>ws>>b>>ws).ignore(numeric_limits<streamsize>::max(),' ')>>d; )
        {
            sb.push_back(b);
            sd.push_back(d);
        }

        // 排序
        sort( sb.begin(), sb.end() );
        sort( sd.begin(), sd.end() );
    }

    // 输出
    cout << "array1 = ";
    copy( sb.begin(), sb.end(), ostream_iterator<double>(cout," ") );
    cout << '\n';
    cout << "array2 = ";
    copy( sd.begin(), sd.end(), ostream_iterator<double>(cout," ") );
    cout << '\n';

    return 0;
}



2018-06-28 15:51
lebronze
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-5-25
收藏
得分:0 
回复 5楼 rjsp
非常感谢版主的回答,代码中有个地方不太明白:
for( double b,d; fin>>a>>b>>c>>d; )
        {
            sb.push_back(b);
            sd.push_back(d);
        }
这里的"fin>>a>>b>>c>>d;"是什么意思?

另外我是想学习下这部分的内容,请问是看stl相关的吗?不想拿来主义啊
2018-06-28 16:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
"fin>>a>>b>>c>>d;"是什么意思?

你应该找本C++的书看看,这是最基础的知识。

我简单讲讲
a定义为string类型,那么 fin>>a 就是从fin这个流中读取一个string到a中
b定义为double类型,那么 fin>>b 就是从fin这个流中读取一个double到b中
fin>>a>>b 就是读取一个string到a中,读取一个double到c中

参见:https://en.

2018-06-28 16:42
lebronze
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-5-25
收藏
得分:0 
回复 7楼 rjsp
恩恩,感谢点拨。
我其实不明白的是  for( double b,d; fin>>a>>b>>c>>d; )

1.这句话,for循环的终止条件是什么? 因为以前写都是   
程序代码:
string str;
                                                          ifstream in; 
                                                          while(in>>str)
                                                          //或者
                                                          while (in >> str, in)


2.fin>>a>>b>>c>>d,就是默认>>可以自动的将文件流中的double类型数据读进来,而不需要加类型控制(%f)这种?

以前用的都是C和matlab,代码量还是太小,还要多学习
2018-06-28 18:22
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
收藏
得分:0 
回复 8楼 lebronze
一个意思, 都是遇到异常才停止输入
话说你那个
while(in >> a, b)
你确定这个可以吗?
2018-06-28 21:45
lebronze
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2016-5-25
收藏
得分:0 
回复 9楼 Jonny0201
我刚专门测试了一下,下面三种while的写法都是可以的,会把文件流in里面的数据以空格为界限,一个个赋给字符串str。
第一个就是赋值完成后跳出;
第二个是in为空跳出;
第三个是in到末尾跳出。

string str;
ifstream in;

while(in>>str)
//while (in >> str, in)
//while (in >> str, !in.eof())
{
...
}

写法很多,不过不知道哪一种是比较规范和稳定的
2018-06-29 09:34
快速回复:c++如何读取包含多列不同类型数据的txt文件
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025290 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved