我有一个包含2列和多行的文本文件。每列用空格分隔。我需要将它们读取到2D阵列以进行进一步计算。 我的数据文件看起来像
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;
}
问题是我无法正确读取它......它要么读取整行......如果我将分隔符指定为'空格',那么它不会读取下一行。
请指出什么是错的。以及如何将数据存储到2d数组以进行进一步计算。 谢谢
答案 0 :(得分:1)
您可以将整行读入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;
}
}
如果文件中的内容与问题中的内容相同,则前三行输出应为:
Value = 0.5 Value = 0.479425539 Value = 1 Value = 0.841470985 Value = 1.5 Value = 0.997494987
对于二维数组,我会使用std::vector
的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]
和array[0][1]
,最后一行的值为array[array.size() - 1][0]
和array[array.size() - 1][1]
。
答案 1 :(得分: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循环显示了如何使用“数组”中的值。严格来说,变量行不是数组,而是矢量矢量。但是,向量比c样式数组更安全,并允许使用[]。
访问其元素[我发布此消息后,我看到一个非常类似的程序作为回复发布。我独立写了我的。]
答案 2 :(得分:0)
随着C ++多年来的发展,以下是现代C ++版本。
#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';
}