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

例如,如果外部文本文件中的数据是这样的:


45.78   67.90   87

34.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;

}


POPMUISE
浏览 1103回答 3
3回答

倚天杖

重复>>循环读取。#include <iostream>#include <fstream>int main(int argc, char * argv[]){&nbsp; &nbsp; std::fstream myfile("D:\\data.txt", std::ios_base::in);&nbsp; &nbsp; float a;&nbsp; &nbsp; while (myfile >> a)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; printf("%f ", a);&nbsp; &nbsp; }&nbsp; &nbsp; getchar();&nbsp; &nbsp; return 0;}结果:45.779999 67.900002 87.000000 34.889999 346.000000 0.980000如果您确切知道文件中有多少个元素,则可以链接>>运算符:int main(int argc, char * argv[]){&nbsp; &nbsp; std::fstream myfile("D:\\data.txt", std::ios_base::in);&nbsp; &nbsp; float a, b, c, d, e, f;&nbsp; &nbsp; myfile >> a >> b >> c >> d >> e >> f;&nbsp; &nbsp; printf("%f\t%f\t%f\t%f\t%f\t%f\n", a, b, c, d, e, f);&nbsp; &nbsp; getchar();&nbsp; &nbsp; return 0;}编辑:回应您对主要问题的评论。您有两个选择。您可以在一个循环(或两个循环)中运行先前的代码并丢弃定义数量的值-例如,如果需要在点(97,60)处的值,则必须跳过5996(= 60 * 100 + 96 )值并使用最后一个。如果您只对指定的值感兴趣,这将起作用。您可以将数据加载到数组中-正如Jerry Coffin提出的那样。他已经给你很好的上课了,这将解决问题。或者,您可以使用简单的数组来存储数据。编辑:如何跳过文件中的值要选择第1234个值,请使用以下代码:int skipped = 1233;for (int i = 0; i < skipped; i++){&nbsp; &nbsp; float tmp;&nbsp; &nbsp; myfile >> tmp;}myfile >> value;

MMTTMM

这可能取决于,特别是取决于您的文件在每行上是否具有相同数量的项目。如果可以,那么您可能想要某种2D矩阵类,通常是这样的:class array2D {&nbsp;&nbsp; &nbsp; std::vector<double> data;&nbsp; &nbsp; size_t columns;public:&nbsp; &nbsp; array2D(size_t x, size_t y) : columns(x), data(x*y) {}&nbsp; &nbsp; double &operator(size_t x, size_t y) {&nbsp; &nbsp; &nbsp; &nbsp;return data[y*columns+x];&nbsp; &nbsp; }};请注意,在撰写本文时,它假设您已经知道预先需要的尺寸。可以避免这种情况,但是代码变得更大,更复杂。无论如何,要读取数字并保持原始结构,通常需要一次将一行读入字符串,然后使用stringstream从该行读取数字。这使您可以将每行中的数据存储到数组中的单独行中。如果您不提前知道大小,或者(尤其是)不同行可能不都包含相同数量的数字:11 12 1323 34 56 78您可能要使用一个std::vector<std::vector<double> >代替。这确实增加了一些开销,但是如果不同的行可能具有不同的大小,则这是完成此工作的简便方法。std::vector<std::vector<double> > numbers;std::string temp;while (std::getline(infile, temp)) {&nbsp; &nbsp; std::istringstream buffer(temp);&nbsp; &nbsp; std::vector<double> line((std::istream_iterator<double>(buffer)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::istream_iterator<double>());&nbsp; &nbsp; numbers.push_back(line);}...或者,使用现代(C ++ 11)编译器,您可以在line的初始化中使用方括号:&nbsp; &nbsp; std::vector<double> line{std::istream_iterator<double>(buffer),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::istream_iterator<double>()};

波斯汪

您可以像其他人一样单独读写。但是,如果您要写到同一本书中,可以尝试以下操作:#include <iostream>#include <fstream>using namespace std;int main() {&nbsp; &nbsp; double data[size of your data];&nbsp; &nbsp; std::ifstream input("file.txt");&nbsp; &nbsp; for (int i = 0; i < size of your data; i++) {&nbsp; &nbsp; &nbsp; &nbsp; input >> data[i];&nbsp; &nbsp; &nbsp; &nbsp; std::cout<< data[i]<<std::endl;&nbsp; &nbsp; &nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP