1

我有一个包含 2 列和多行的文本文件。每列由空格分隔。我需要将它们读入二维数组以进行进一步计算。我的数据文件看起来像

0.5 0.479425539
1   0.841470985
1.5 0.997494987
2   0.909297427
2.5 0.598472144
3   0.141120008
3.5 -0.350783228
4   -0.756802495
4.5 -0.977530118
5   -0.958924275  

我微弱的尝试是

#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <ctype.h>
using namespace std;

int main () {
  char line,element;
  std::ifstream myfile ("C:\\Users\\g\\Desktop\\test.txt");
  if (myfile.is_open())
  {
    while ( myfile.good() )
    {
      getline(myfile,line);
       cout << line<<endl;               
      _getch();
    }
    myfile.close();

  }

  else cout << "Unable to open file"; 

  return 0;

}

问题是我无法正确读取它们......它要么读取整行......如果我将分隔符指定为“空格”,那么它不会读取下一行。

请指出什么是错的。以及我应该怎么做才能将数据存储到二维数组中以进行进一步计算。谢谢

4

3 回答 3

1

您可以将整行读入 a std::string,然后用于std::istringstream从行中提取值。


完整的工作程序:

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

int main()
{
    std::ifstream file("C:\\Users\\g\\Desktop\\test.txt");

    std::string line;

    // Read a line of input from the file
    while (std::getline(file, line))
    {
        // `istringstream` behaves like a normal input stream
        // but can be initialized from a string
        std::istringstream iss(line);

        float value;

        // The input operator `>>` returns the stream
        // And streams can be used as a boolean value
        // A stream is "true" as long as everything is okay
        while (iss >> value)
        {
            std::cout << "Value = " << value << '\t';
        }

        // Flush the standard output stream and print a newline
        std::cout << std::endl;
    }
}

鉴于文件中的内容与问题中的内容相同,输出的前三行应为:

值 = 0.5 值 = 0.479425539
值 = 1 值 = 0.841470985
值 = 1.5 值 = 0.997494987

对于二维数组,我会使用 a std::vectorof std::array

#include <vector>
#include <array>

...

std::vector<std::array<float, 2>> array;

...

float value1, value2;
if (iss >> value1 >> value2)
{
    std::cout << "Values = " << value1 << ", " << value2;

    array.emplace_back(std::array<int, 2>{{value1, value2}});
}

现在第一行的值为array[0][0]and array[0][1],最后一行的值为array[array.size() - 1][0]and array[array.size() - 1][1]

于 2013-01-30T09:29:33.607 回答
1
#include <fstream>
#include <string>
#include <sstream>
#include <iostream>
#include <vector>

int main(int argc, char** argv) {
   std::ifstream f(argv[1]);
   std::string l;
   std::vector<std::vector<double> > rows;
   while(std::getline(f, l)) {
       std::stringstream s(l);
       double d1;
       double d2;
       if(s >> d1 >> d2) {
           std::vector<double> row;
            row.push_back(d1);
            row.push_back(d2);
            rows.push_back(row);
        }
    }

    for(int i = 0; i < rows.size(); ++i)
        std::cout << rows[i][0] << " " << rows[i][1] << '\n';
}

最后一个 for 循环显示了如何使用“数组”中的值。变量 rows 严格来说不是一个数组,而是一个向量的向量。但是,向量比 c 风格的数组更安全,并且允许使用 [] 访问其元素。

[当我发布此内容时,我看到一个非常相似的程序作为响应发布。我自己写的。]

于 2013-01-30T09:41:20.983 回答
0

随着 C++ 多年来的发展,以下是现代 C++ 版本。

  • 它尽可能使用自动
  • 使用 std::pair 保存 2 个值(std::pair 是具有两个元素的 std::tuple 的特定情况)
  • 不关闭文件(析构函数在块末尾执行此操作)
  • 不逐行读取,因为流使用 <space> 和 <enter> 作为分隔符
  • 变量具有有意义的名称,因此程序很容易“读取”,
  • 使用范围 for 循环输出数据。
  • 不会将整个 std 命名空间带入代码 -为什么“使用命名空间 std”被认为是不好的做法?

.

#include <fstream>
#include <iostream>
#include <vector>
#include <utility>

int main( int argc, char** argv )
{
    if ( argc < 1 )
        return -1;

    const auto    fileName = argv[ 1 ];
    std::ifstream fileToRead( fileName );

    typedef std::pair< double, double > DoublesPair;
    std::vector< DoublesPair > rowsOfDoublesPair;
    DoublesPair                doublePairFromFile;

    while ( fileToRead >> doublePairFromFile.first >> doublePairFromFile.second )
    {
        rowsOfDoublesPair.push_back( doublePairFromFile );
    }

    for ( const auto row : rowsOfDoublesPair )
        std::cout << row.first << " " << row.second << '\n';
}
于 2017-03-07T19:21:28.437 回答