C++ 函数从文件读入向量C++;

C++ 函数从文件读入向量C++;,c++,fstream,C++,Fstream,我编写了一个函数,它从文件到向量中读取未知数量的数据(在列中) #include <iostream> #include <vector> #include <fstream> // file writing #include <cassert> void ReadFromFile(std::vector<double> &x, const std::string &file_name) { std::ifs

我编写了一个函数,它从文件到向量中读取未知数量的数据(在列中)

#include <iostream>
#include <vector>
#include <fstream> // file writing
#include <cassert>


void ReadFromFile(std::vector<double> &x, const std::string &file_name)
{
    std::ifstream read_file(file_name);
    assert(read_file.is_open());

    size_t lineCount = 0;
    while (!read_file.eof())
    {
        double temp;
        read_file >> temp;
        x.at(lineCount) = temp;
        if (lineCount == x.size() - 1) { break; } // fixes the out of range exception

        lineCount++;
    }
    read_file.close();
}
int main()
{
    size_t Nx = 7;
    size_t Ny = 7;
    size_t Nz = 7;
    size_t N = Nx*Ny*Nz;

    // Initial Arrays 
    std::vector <double> rx(N);
    std::string Loadrx = "Loadrx.txt";
    ReadFromFile(rx, Loadrx);
}
#包括
#包括
#包括//文件写入
#包括
void ReadFromFile(std::vector&x,const std::string&file\u name)
{
std::ifstream read_文件(文件名);
断言(read_file.is_open());
大小\u t行数=0;
而(!read_file.eof())
{
双温;
读取文件>>温度;
x、 at(测线计数)=温度;
if(lineCount==x.size()-1){break;}//修复了超出范围的异常
lineCount++;
}
read_file.close();
}
int main()
{
尺寸Nx=7;
尺寸=7;
尺寸=7;
尺寸N=Nx*Ny*Nz;
//初始数组
std::向量rx(N);
std::string Loadrx=“Loadrx.txt”;
ReadFromFile(rx,Loadrx);
}
但是,在将文件中的数据复制到向量中后,行数将额外增加一次。有没有比我写的if语句更优雅的方法来解决这个问题

编辑:显然,我不会上传数据文件。代码编译得非常完美,我只是想在if语句中寻找改进(如果存在)。

试试:

void ReadFromFile(const size_t N, 
                  std::vector<double> &x, 
                  const std::string &file_name)
{
    std::ifstream read_file(file_name);
    assert(read_file.is_open());

    while (true)
    {
        double temp;
        read_file >> temp;  // read something

        if(read_file.eof()) break; // exit when eof

        x.push_back(temp);    
        if (N == x.size()) break;  // exit when N elements
    }
    read_file.close();
}

int main()
{
    size_t N = 10;
    std::vector<double> v;
    v.reserve(N);
    ReadFromFile(v,"Data.txt");
}
void ReadFromFile(常量大小),
std::vector&x,
常量std::字符串和文件(名称)
{
std::ifstream read_文件(文件名);
断言(read_file.is_open());
while(true)
{
双温;
读取文件>>temp;//读取某些内容
if(read_file.eof())break;//在eof时退出
x、 推回(温度);
if(N==x.size())break;//当N个元素
}
read_file.close();
}
int main()
{
尺寸N=10;
std::向量v;
v、 储备(N);
ReadFromFile(v,“Data.txt”);
}
试试:

void ReadFromFile(常量大小),
std::vector&x,
常量std::字符串和文件(名称)
{
std::ifstream read_文件(文件名);
断言(read_file.is_open());
while(true)
{
双温;
读取文件>>temp;//读取某些内容
if(read_file.eof())break;//在eof时退出
x、 推回(温度);
if(N==x.size())break;//当N个元素
}
read_file.close();
}
int main()
{
尺寸N=10;
std::向量v;
v、 储备(N);
ReadFromFile(v,“Data.txt”);
}
我编写了一个函数,可以将未知数的数据(在列中时)从文件读取到向量

#include <iostream>
#include <vector>
#include <fstream> // file writing
#include <cassert>


void ReadFromFile(std::vector<double> &x, const std::string &file_name)
{
    std::ifstream read_file(file_name);
    assert(read_file.is_open());

    size_t lineCount = 0;
    while (!read_file.eof())
    {
        double temp;
        read_file >> temp;
        x.at(lineCount) = temp;
        if (lineCount == x.size() - 1) { break; } // fixes the out of range exception

        lineCount++;
    }
    read_file.close();
}
int main()
{
    size_t Nx = 7;
    size_t Ny = 7;
    size_t Nz = 7;
    size_t N = Nx*Ny*Nz;

    // Initial Arrays 
    std::vector <double> rx(N);
    std::string Loadrx = "Loadrx.txt";
    ReadFromFile(rx, Loadrx);
}
从“列”(或其他常规格式)文件中读取未知数量数据的最优雅(我想也是最惯用的)方法之一是使用istream迭代器:

void ReadFromFile(std::vector<double> &x, const std::string &file_name)
{
    std::ifstream read_file(file_name);
    assert(read_file.is_open());

    std::copy(std::istream_iterator<double>(read_file), std::istream_iterator<double>(),
        std::back_inserter(x));

    read_file.close();
}
用法显而易见:

ReadFromFile(rx, Loadrx, max_numbers);
我编写了一个函数,可以将未知数的数据(在列中时)从文件读取到向量

#include <iostream>
#include <vector>
#include <fstream> // file writing
#include <cassert>


void ReadFromFile(std::vector<double> &x, const std::string &file_name)
{
    std::ifstream read_file(file_name);
    assert(read_file.is_open());

    size_t lineCount = 0;
    while (!read_file.eof())
    {
        double temp;
        read_file >> temp;
        x.at(lineCount) = temp;
        if (lineCount == x.size() - 1) { break; } // fixes the out of range exception

        lineCount++;
    }
    read_file.close();
}
int main()
{
    size_t Nx = 7;
    size_t Ny = 7;
    size_t Nz = 7;
    size_t N = Nx*Ny*Nz;

    // Initial Arrays 
    std::vector <double> rx(N);
    std::string Loadrx = "Loadrx.txt";
    ReadFromFile(rx, Loadrx);
}
从“列”(或其他常规格式)文件中读取未知数量数据的最优雅(我想也是最惯用的)方法之一是使用istream迭代器:

void ReadFromFile(std::vector<double> &x, const std::string &file_name)
{
    std::ifstream read_file(file_name);
    assert(read_file.is_open());

    std::copy(std::istream_iterator<double>(read_file), std::istream_iterator<double>(),
        std::back_inserter(x));

    read_file.close();
}
用法显而易见:

ReadFromFile(rx, Loadrx, max_numbers);

改用getline()。@Matt你在说什么?代码在VS15中编译得很好使用x.push_back()而不是x.at(linecount),将N直接传递给ReadFromFile,构造v但保留为空,并保留N个元素。@nikjohn您知道编辑是被跟踪的。原来的问题没有汇编。很好的尝试。@Matt您确实意识到错误主要存在,这是不相关的,因为我只是要求改进void函数中if语句的逻辑。此外,您确实意识到,由于未提供to数据文件,因此代码无法独立编译。请改用getline()。@Matt您在说什么?代码在VS15中编译得很好使用x.push_back()而不是x.at(linecount),将N直接传递给ReadFromFile,构造v但保留为空,并保留N个元素。@nikjohn您知道编辑是被跟踪的。原来的问题没有汇编。很好的尝试。@Matt您确实意识到错误主要存在,这是不相关的,因为我只是要求改进void函数中if语句的逻辑。此外,您确实意识到,由于未提供to数据文件,因此代码不会独立于此进行编译。也许可以根据文件大小提前“保留”向量大小来对其进行优化?就像在Maybe中一样,可以根据文件大小提前“保留”向量大小来优化它?喜欢