为了账号安全,请及时绑定邮箱和手机立即绑定

从C ++中的文本文件读取数值数据

从C ++中的文本文件读取数值数据

C++
POPMUISE 2019-11-14 10:02:48
例如,如果外部文本文件中的数据是这样的:45.78   67.90   8734.89   346     0.98如何阅读此文本文件并将每个数字分配给c ++中的变量?使用ifstream,我可以打开文本文件并将第一个数字分配给变量,但是我不知道如何读取空格后的下一个数字。#include <iostream>#include <fstream>using namespace std;int main(){    float a;    ifstream myfile;    myfile.open("data.txt");    myfile >> a;    cout << a;    myfile.close();    system("pause");    return 0;}#include <iostream>#include <fstream>using namespace std;int main(){    int data[6], a, b, c, d, e, f;    ifstream myfile;    myfile.open("a.txt");    for(int i = 0; i << 6; i++)        myfile >> data[i];    myfile.close();    a = data[0];    b = data[1];    c = data[2];    d = data[3];    e = data[4];    f = data[5];    cout << a << "\t" << b << "\t" << c << "\t" << d << "\t" << e << "\t" << f << "\n";    system("pause");    return 0;}
查看完整描述

3 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

重复>>循环读取。


#include <iostream>

#include <fstream>

int main(int argc, char * argv[])

{

    std::fstream myfile("D:\\data.txt", std::ios_base::in);


    float a;

    while (myfile >> a)

    {

        printf("%f ", a);

    }


    getchar();


    return 0;

}

结果:


45.779999 67.900002 87.000000 34.889999 346.000000 0.980000


如果您确切知道文件中有多少个元素,则可以链接>>运算符:


int main(int argc, char * argv[])

{

    std::fstream myfile("D:\\data.txt", std::ios_base::in);


    float a, b, c, d, e, f;


    myfile >> a >> b >> c >> d >> e >> f;


    printf("%f\t%f\t%f\t%f\t%f\t%f\n", a, b, c, d, e, f);


    getchar();


    return 0;

}

编辑:回应您对主要问题的评论。


您有两个选择。


您可以在一个循环(或两个循环)中运行先前的代码并丢弃定义数量的值-例如,如果需要在点(97,60)处的值,则必须跳过5996(= 60 * 100 + 96 )值并使用最后一个。如果您只对指定的值感兴趣,这将起作用。

您可以将数据加载到数组中-正如Jerry Coffin提出的那样。他已经给你很好的上课了,这将解决问题。或者,您可以使用简单的数组来存储数据。

编辑:如何跳过文件中的值


要选择第1234个值,请使用以下代码:


int skipped = 1233;

for (int i = 0; i < skipped; i++)

{

    float tmp;

    myfile >> tmp;

}

myfile >> value;


查看完整回答
反对 回复 2019-11-14
?
MMTTMM

TA贡献1869条经验 获得超4个赞

这可能取决于,特别是取决于您的文件在每行上是否具有相同数量的项目。如果可以,那么您可能想要某种2D矩阵类,通常是这样的:


class array2D { 

    std::vector<double> data;

    size_t columns;

public:

    array2D(size_t x, size_t y) : columns(x), data(x*y) {}


    double &operator(size_t x, size_t y) {

       return data[y*columns+x];

    }

};

请注意,在撰写本文时,它假设您已经知道预先需要的尺寸。可以避免这种情况,但是代码变得更大,更复杂。


无论如何,要读取数字并保持原始结构,通常需要一次将一行读入字符串,然后使用stringstream从该行读取数字。这使您可以将每行中的数据存储到数组中的单独行中。


如果您不提前知道大小,或者(尤其是)不同行可能不都包含相同数量的数字:


11 12 13

23 34 56 78

您可能要使用一个std::vector<std::vector<double> >代替。这确实增加了一些开销,但是如果不同的行可能具有不同的大小,则这是完成此工作的简便方法。


std::vector<std::vector<double> > numbers;


std::string temp;


while (std::getline(infile, temp)) {

    std::istringstream buffer(temp);

    std::vector<double> line((std::istream_iterator<double>(buffer)),

                             std::istream_iterator<double>());


    numbers.push_back(line);

}

...或者,使用现代(C ++ 11)编译器,您可以在line的初始化中使用方括号:


    std::vector<double> line{std::istream_iterator<double>(buffer),

                             std::istream_iterator<double>()};


查看完整回答
反对 回复 2019-11-14
?
波斯汪

TA贡献1811条经验 获得超4个赞

您可以像其他人一样单独读写。但是,如果您要写到同一本书中,可以尝试以下操作:


#include <iostream>

#include <fstream>


using namespace std;


int main() {


    double data[size of your data];


    std::ifstream input("file.txt");


    for (int i = 0; i < size of your data; i++) {

        input >> data[i];

        std::cout<< data[i]<<std::endl;

        }


}


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 1102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信