【问题标题】:c++ how-to: import numeric variables from .txt or .csv filec++ how-to:从 .txt 或 .csv 文件导入数值变量
【发布时间】:2013-07-15 13:57:11
【问题描述】:

仍然是 C++ 的初学者,我不知道如何使用 fstream。 我想为程序中的一组 double 变量赋值,来自 .txt.csv 文件(出于实际原因,.csv 可能更好。)

假设我的input_file.csv 看起来像这样:

10
0
20
0.4
0.1333382222
0
0.5
10
20
0.76
0.3
0.1
0.2

这些值应该分配给我的代码中的以下变量(首先声明为等于0):

/// geometry
double Dist=0; ///Distance between the 2

double PosAi = 0;
double PosAo = 0;
double PosBi = 0;
double PosBo = 0; ///positions i/o

/// densities

double iDA=0;
double oDA=0;
double iDAtop=0;
double oDAtop=0; /// Left

double iDB=0;
double oDB=0;
double iDBtop=0;
double oDBtop=0; /// Right

我想读取input_file.csv 的值并将它们分配给我的变量,这样如果我输入:

cout<<Dist<<" "<<PosAi<<" "<<PosAo<<" "<<

…………等等。 ;

我在控制台上得到以下列表:

10 0 20 0.4 0.1333382222 0 0.5 10 20 0.76 0.3 0.1 0.2

但是我不知道如何使用 fsteam 来做这件事,你能帮帮我吗? 谢谢!


如果像我这样的初学者遇到同样的问题,这就是答案:

#include <iostream>
#include <fstream>
using namespace std;

/// geometry

double Dist=0; ///Distance between the 2
double PosAi = 0;
double PosAo = 0;
double PosBi = 0;
double PosBo = 0; ///positions i/o

/// densities

double iDA=0;
double oDA=0;
double iDAtop=0;
double oDAtop=0; /// Left
double iDB=0;
double oDB=0;
double iDBtop=0;
double oDBtop=0; /// Right

int main()
{
ifstream ifs ("input.csv");
if (!ifs)
    // process error
ifs >> Dist;
ifs >> PosAi;
ifs >> PosAo;
ifs >> PosBi;
ifs >> PosBo;
ifs >> iDA;
ifs >> oDA;
ifs >> iDAtop;
ifs >> oDAtop;
ifs >> iDB;
ifs >> oDB;
ifs >> iDBtop;
ifs >> oDBtop;

    // print variables

    cout << Dist << " " << PosAi << " " << PosAo << " " << PosBi << " " << PosBo << " " << iDA << " " << oDA << " " << iDAtop << " " << oDAtop << " " << iDB << " " << oDB << " " << iDBtop << " " << oDBtop << endl;
}

谢谢

【问题讨论】:

  • 如果您不向我们展示您尝试过的更多内容,就很难为您提供帮助,因为我告诉您如何做您已经知道的事情毫无意义。
  • 这次修改后是不是更清楚了?
  • @adrienlucca.wordpress.com 你不使用fstream,你使用ofstream。而且您可能不会直接访问它,而是通过istream&amp;
  • 嗯,jsp 已经给出了答案,这与我在这一点上的建议一致(除了“获取一本关于 C++ 的书”)

标签: c++ variables csv assign


【解决方案1】:
ifstream ifs ("input_file.txt");
if (!ifs)
    // process error
ifs >> DISTAB;
ifs >> POSAstart;
....

【讨论】:

  • 太棒了!谢谢。我为像我这样的菜鸟添加了问题中的代码!
  • 顺便说一句,您的输入没有用逗号分隔,因此 .csv 扩展名不太准确。 (如果您确实用逗号分隔值,只会使阅读它们变得更加复杂。)
  • 谢谢,我知道这种数据结构只需要一个 .txt 文件。但这只是一个测试,因为我想尝试另一种结构,例如:12.3, 36.45, 27.36 欢迎任何建议!
【解决方案2】:

如果您知道如何使用cout 打印一堆变量,那么您就知道如何使用输入流读取它们——情况正好相反。只需将您的 cout 呼叫的箭头反转:

myInputFile >> Dist >> PosAi >> PosAo >> ...;

注意,输入流只能将实际变量作为&gt;&gt; 的参数,而输出流可以采用临时变量,例如使用&lt;&lt; " " 打印空间的方式。但幸运的是,输入流会自动吃掉空格,所以你可以忽略它。因此我在上一行的例子是正确的。

此外,cout 已在 iostream 中预先声明,但您需要声明输入流。 ifstream 将要读取的文件名作为其第一个参数:

ifstream myInputFile ("input_file.csv");

【讨论】:

  • 情况并非完全相反。您提到分隔符,必须显式输出,但会在输入时隐式跳过(前提是它们只是空格——CVS 文件通常使用逗号,必须显式读取并跳过)。更重要的是,在使用输入的任何值之前,必须检查输入是否成功;否则,你有未定义的行为。
【解决方案3】:

首先,您不会(通常)为此使用fstream,而是使用 一个ifstream。而且您通常不会直接访问它,但是 通过istream&amp;;正如ofstream 源自 ostream,ifstreamderives fromistream, so that you can use istream&`与流的类型无关。

最后,对于ostream 上的每个&lt;&lt; 运算符,有 istream 上的相应 &gt;&gt; 运算符,所以如果你能做到 std::cout &lt;&lt; x,你可以做input &gt;&gt; x(当然,你 通常不做std::cout &lt;&lt; x,你做output &lt;&lt; x,其中 output 是传递给函数的ostream&amp;——也许 std::cout,但也可能是 std::ofstream,或其他 ostream)。当然有区别:输出是 通常比输入更容易,因为您控制源 (你的变量);输入需要大量的错误检查,因为 你可以收到任何东西。特别是,您不能, 永远,使用任何输入值,直到您验证输入 成功了。在输出的情况下,你一般只做这个 一次,在输出结束时(最后一次刷新到 std::cout,或关闭后std::ofstream)。

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多