C++ 从C++;

C++ 从C++;,c++,C++,例如,如果外部文本文件中的数据如下所示: 45.78 67.90 87 34.89 346 0.98 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) {

例如,如果外部文本文件中的数据如下所示:

45.78   67.90   87
34.89   346     0.98
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];
    }
};
如何读取这个文本文件并将每个数字分配给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;
}
#包括
#包括
使用名称空间std;
int main()
{
浮动a;
ifstreammyfile;
myfile.open(“data.txt”);
myfile>>a;
cout数据[i];
myfile.close();
a=数据[0];
b=数据[1];
c=数据[2];
d=数据[3];
e=数据[4];
f=数据[5];

cout数字的输入运算符跳过前导空格,因此您可以在循环中读取数字:

while (myfile >> a)
{
    // ...
}

重复>>在循环中读取

#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;
}

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

你有两个选择

  • 您可以在一个循环(或两个循环)中运行前面的代码并丢弃定义数量的值-例如,如果您需要点(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;
int-skipped=1233;
for(int i=0;i>tmp;
}
myfile>>值;

这可能取决于,尤其是取决于您的文件在每行上的项数是否相同。如果相同,则您可能需要某种类型的2D矩阵类,通常如下所示:

45.78   67.90   87
34.89   346     0.98
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];
    }
};
您可能想改用
std::vector
。这会增加一些开销,但如果不同的行可能有不同的大小,这是一种简单的方法

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);
}

你可以像其他人一样独立地读和写。 但如果您想写入同一个,您可以尝试以下方法:

#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;
        }

}
#包括
#包括
使用名称空间std;
int main(){
双数据[数据大小];
std::ifstream输入(“file.txt”);
for(int i=0;i<数据大小;i++){
输入>>数据[i];

std::coutthanks。但是输入操作符按行读取数字。我如何读取下一列中的数字???@UsmanNaseer:根据这个答案中建议的循环,第一次输入循环
a
将是45.78,下一次是67.90,然后是87,然后是34.89,346,最后一次是0.98。这不是你需要的吗?@UsmanNaseer记得吗文件是一个流,程序看到的数据是行或列,但是是这样的单个流:
“45.78 67.90 87\n34.89 346 0.98”
。因此,输入操作将始终读取流中“列”中的下一个数字可以这么说,顺序。非常感谢。但我想将这些数字存储在不同的变量中。我是否应该首先使用循环读取所有数字,并将它们存储到一个数组中,然后将此数组的不同元素分配给变量?记住,如果其中一个答案符合您的需要,请将其标记为已接受。否则,如果出现问题,请毫不犹豫地添加注释需要清除ing。#include#include使用命名空间std;int main(){int data[6],a,b,c,d,e,f;ifstream myfile;myfile.open(“a.txt”);for(int i=0;idata[i];}myfile.close();a=data[0];b=data[1];c=data[2];d=data[3];e=data[4];f=data[5];你为什么不使用我的第二个解决方案?另外,如果你想输入一些代码,请编辑你的帖子,而不是在评论中输入。你粘贴了一些代码,问题出在哪里?@spook。你的第二个解决方案非常有帮助。我的问题的最后一步是我想从文本中读取不同的数字(我已经成功地接受了你的建议)然后把它们放入一个数组中,给数组中的不同元素分配一个不同的变量,这样我就可以用这些变量进行一些计算了。非常感谢……但我需要一些时间才能理解你的回答:)@ Unman Nase:也许我刚才添加的示例代码会很有帮助。非常好,1。这就是我所说的一个惯用的C++解决方案。不错,但是它与OP的问题没有多大关系。从他在评论中写的,他想把每个数字读入不同的变量……如果我正确地理解了他的最后一个版本。代码:调用“std::vector::push_back(std::vector(&)(std::istream_迭代器,std::istream_迭代器(*))”时没有匹配的函数您的文本文件包含浮点数,但您尝试将它们读入int数组()。这不会像你期望的那样起作用。问题很不清楚,你想达到什么目的?也许写下你期望得到的输入和输出。如果答案真的解决了你的问题,就接受答案:)人们很少会研究已回答的问题来提供更多帮助。@Spook:我的问题的简单描述是“文本文件包含100行*100列的数字(例如)现在我想让我的程序从第60行和第97列中提取一个数字,然后将这个值赋给一个变量,并用这个变量进行一些计算。所以我想从一个包含很多数字的文本文件中提取一些随机数。我该怎么做呢?感谢患者的回复:)最后!这就是我们的答案e等待:)我很快会修改我的答案。系统(“暂停”),嗯?我刚刚尝试过,它工作得很好,你可以随心所欲地开发。希望它对你有帮助
#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;
        }

}