【问题标题】:C++ Reading double values into a 2D array from a file containing both strings and doublesC ++从包含字符串和双精度的文件中将双精度值读取到二维数组中
【发布时间】:2016-06-11 02:43:33
【问题描述】:

我正在处理一个程序,其中有一个包含州名的输入文件,以及每个州的三种单独的税:销售税、财产税和所得税。我正在尝试将税值(读取为双变量)读入双精度数组。这是我的代码:

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

int main()
{
   double a = 0,
       b = 0,
       c = 0;
   double array[5][3];
   string state_name;
   ifstream fin;
   fin.open("test.dat");

   for (; fin >> state_name >> a >> b >> c;)
   {
       for (int i = 0; i < 5; i++)
       {
          for (int j = 0; j < 3; j++)
          {
             fin >> array[i][j];
             cout << array[i][j] << "\t";
           }
           cout << endl;
        }
    }


    return 0;
}

这是数据文件:

    TEXAS        .0825 .02  -.03
    CALIFORNIA   .065  .04   .05
    MARYLAND     .03   .025  .03
    MAINE        .095  .055  .045
    OHIO         .02   .015  .02

从this,程序输出数组,除了每个位置读取-9.25596e+061。我想知道这是否是因为程序试图将字符串读入数组。我还想知道是否有一种方法可以逐行忽略文件中的字符串,以便只将双精度值读入数组。

【问题讨论】:

  • 您应该使用 while(fin &gt;&gt; state_name &gt;&gt; a &gt;&gt; b &gt;&gt; c) 而不是 for 循环。这样你的意思就更清楚了。

标签: c++ arrays string double


【解决方案1】:

您在for 循环中阅读了整行。以后不需要fin &gt;&gt; array[i][j]。相反,您应该这样做:

for (int i = 0; i < 5; i++)
{
    fin >> state_name;
    for(int j = 0; j < 3; ++j)
    {
        fin >> array[i][j];
        cout << array[i][j] << '\t';
    }
    cout << endl;

    if(!fin)
    {
         // handle an error reading the file
    }
}

【讨论】:

  • 我调整了代码以包含fin &gt;&gt; state_name;,程序运行了大部分文件,但没有为德克萨斯州输出.0825 .02 -.03。此外,数组中的最后一行仍然是-9.25596e+061,但其他值都很好。我想知道这里是否还有其他事情发生。
  • 您误解了我的替换代码。上面的代码应该替换你的整个 for (; fin &gt;&gt; state_name &gt;&gt; a &gt;&gt; b &gt;&gt; c;) { ... } 循环
  • 在 for-read 循环中曾经做过类似的事情吗?或者,是否有可能在 for-read 循环中做同样的事情?
  • 如果您查看 pbarmettler 的回答,您可以将其作为 for 循环来执行。你可以用for(; fin &gt;&gt; state_name &gt;&gt; array[row][0] &gt;&gt; array[row][1] &gt;&gt; array[row][2]; ) { ++row; } 替换他的while 循环,但是使用这样的for 循环会有点奇怪。不过在技术上并没有什么问题。
  • 明白。无论哪种方式,您的意见都帮助了我。我现在肯定更好地理解它。谢谢!
【解决方案2】:

这应该可以完成工作:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {

    double array[5][3];
    string state_name;

    ifstream fin;
    fin.open("test.dat");

    // Read the file row by row
    int row =0;
    while(fin >> state_name >> array[row][0] >> array[row][1] >> array[row][2]) {
       ++row;
    }

    // Print the result
    for(int i = 0; i < 5; i++) {
       for(int j = 0; j < 3; j++) {
           cout << array[i][j] << "\t";
       }
       cout << endl;
     }

     return 0;
 }

如果您允许我进一步思考,您可能更愿意将每一行推入向量而不是静态数组。否则,如果文件超过 5 行,则需要重写代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多