【问题标题】:C++ read txt data and char into 2D arrayC ++将txt数据和char读取到二维数组中
【发布时间】:2017-08-07 20:19:46
【问题描述】:

我想将包含数据和字符的文本读入 arrayA[][]。好像

然后我需要计算数据。我的代码无法做到这一点。我尝试输出 A[][] 以查看是否有任何问题,结果发现所有元素都是 0.000。请帮助我了解如何更改它。谢谢!

enter code here

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <fstream>
#include <limits>
int    p = 518868;
int    q = 11;
int    s, t, i, j, k, m, d, r, u;
double A[518868][11];
int    main(void)
{

    FILE  *fid;

    using namespace std;

    ifstream file("dump600.txt");

    if (file.is_open())
      {
        for (i = 1; i <= p; i++)
          {
            for (j = 1; j <= q; j++)
              {
                file >> A[i][j];
              }
          }
      }



fid = fopen("RstA600.txt", "wt");
for (i = 1; i <= 10000; i++)
{
    for (j = 1; j <= 11; j++)
    {
        if (j == 11)
        {
           fprintf(fid, "%f\n", A[i][j]);
        }
        else
        {
            fprintf(fid, "%f\t", A[i][j]);
        }
    }
}
fclose(fid);

dump600.txt
id  type x  y   z   c_q[1]       c_q[2]     c_q[3]       c_q[4]    x    y
1   1    0  0   30  -0.0075608  -0.710037   0.703789    0.021699    0   0
3   1    10 0   30  0.0138984   -0.409617   0.0338428   -0.911523   10  0
5   1    20 0   30  -0.31169    -0.685503   0.450455    0.479609    20  0
7   1    30 0   30  -0.194787   -0.373789   0.511419    -0.74886    30  0

【问题讨论】:

  • C++中的数组以索引0开头,而不是1,所以应该是for (i = 0; i &lt; p; i++)等等;此外,检查运算符&gt;&gt; 的返回值,看看是否可以正确读取某个值。如果第一行包含除数字以外的任何内容,您的代码可能会失败,因为它会在将这个非数字作为数字读取时反复失败。
  • 你能把它格式化成可读的东西吗 id type x y z c_q[1] c_q[2] c_q[3] c_q[4] x y 1 1 0 0 30 -0.0075608 -0.710037 0.703789 0.021699 0 0 3 1 10 0 30 0.0138984 -0.409617 0.0338428 -0.911523 10 0 5 1 20 0 30 -0.31169 -0.685503 0.450455 0.479609 0 20 7 1 30 0 30 -0.194787 -0.373789 0.511419 -0.74886 30 0 跨度>
  • 这是一个学习使用调试器并逐步检查代码以找出问题所在的好机会。
  • 读取并丢弃带有std::getline 的第一行。之后,使用类似于if (! file &gt;&gt; A[i][j]) { std::cerr &lt;&lt; "cannot parse input\n"; return -1; } 的东西将文件读入数组。
  • @Ron vector of vectors 由于空间局部性差,速度很慢。 vectorstd::array 会更好地假设(这是一个相当安全的假设)std::array 不会做任何愚蠢的事情来破坏数据连续性。

标签: c++ arrays text character 2d


【解决方案1】:

问题似乎是包含文本的第一行,这将使任何file &gt;&gt; A[i][j] 失败。为了克服这个问题,您可以使用std::getline 跳过第一行;还考虑以某种方式对无效输入做出反应。此外,C++ 中的索引以0 开头,而不是以1 开头,这样for (j = 1; j &lt;= q; j++) 等等就会超出范围并产生未定义的行为。查看应该可以工作的代码示例:

  if (file.is_open())
  {
    std::string line;
    if(std::getline(file, line)) {
      for (i = 0; i < p; i++)
      {
          for (j = 0; j < q; j++)
          {
             if (!file >> A[i][j]) {
                cout << "Invalid input.";
             }
          }
      }
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多