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

Usm*_*eer 39 c++

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

45.78   67.90   87
34.89   346     0.98
Run Code Online (Sandbox Code Playgroud)

如何阅读此文本文件并将每个数字分配给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;
}
Run Code Online (Sandbox Code Playgroud)

Spo*_*ook 62

重复>>读入循环.

#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;
}
Run Code Online (Sandbox Code Playgroud)

结果:

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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:回答您在主要问题中的评论.

你有两个选择.

  • 您可以在循环(或两个循环)中运行以前的代码并丢弃定义数量的值 - 例如,如果您需要点(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;
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 9

它可能取决于,尤其是您的文件是否在每行上具有相同数量的项目.如果它会,那么你可能想要某种类型的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];
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,正如它所写,这假设您需要预先知道您需要的大小.这可以避免,但代码变得更大,更复杂.

在任何情况下,要读取数字并保持原始结构,通常一次读一行到一个字符串,然后使用字符串流从行读取数字.这使您可以将每行的数据存储到数组中的单独行中.

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

11 12 13
23 34 56 78
Run Code Online (Sandbox Code Playgroud)

你可能想用一个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);
}
Run Code Online (Sandbox Code Playgroud)

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

    std::vector<double> line{std::istream_iterator<double>(buffer),
                             std::istream_iterator<double>()};
Run Code Online (Sandbox Code Playgroud)


Som*_*ude 7

数字的输入运算符会跳过前导空格,因此您只需读取循环中的数字:

while (myfile >> a)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)