如果我的文本文件如下:
4
1 2 3
4 5 6
7 8 9
10 11 12
我想将每列数字读入变量x,y和z。 所以读完之后,z = [3,6,9,12]。
如何解析文本文件以将每列的每一行存储在自己的变量中?
所以也许将整个文本文件存储为字符串" / n"对于每一行,然后为每一行解析x = sting [i],y = string [i + 1],z = string [i + 2]?或类似的东西。
我认为必须有更好的方法来做到这一点,特别是当n非常大时。
〜(编辑)顶部的第一个数字(本例中为4)确定文本文件将包含多少行。 所以,如果我设置n = 4,那么有一个for循环:for(i = 0; i
答案 0 :(得分:3)
一次读取一个项目,将每个项目添加到相应的数组中:
std::vector<int> x,y,z;
int xx, yy, zz;
while(std::cin >> xx >> yy >> zz) {
x.push_back(xx);
y.push_back(yy);
z.push_back(zz);
}
<小时/> 编辑:响应添加的要求
int n;
if( !( std::cin >> n) )
return;
std::vector<int> x,y,z;
int xx, yy, zz;
while(n-- && std::cin >> xx >> yy >> zz) {
x.push_back(xx);
y.push_back(yy);
z.push_back(zz);
}
答案 1 :(得分:1)
寻求“通用”解决方案(其中n
是列数)。在这种情况下,不是单独的矢量变量,最好使用矢量矢量:
std::fstream file("file.txt", ios_base::in);
std::vector< std::vector<int> > vars(n, vector<int>(100));
int curret_line = 0;
while (!file.eof())
{
for (int i=0; i<n; ++i)
{
file >> vars[i][current_line];
}
++current_line;
// if current_line > vars[i].size() you should .resize() the vector
}
编辑:根据以下评论更新循环
int i=0, current_line = 0;
while (file >> vars[i][current_line])
{
if (i++ == n)
{
i = 0;
++current_line;
}
}
答案 2 :(得分:0)
这是一种方法,通过一些基本的错误检查。我们将一个小于或大于3个整数的行视为错误:
#include <fstream>
#include <string>
#include <sstream>
#include <cctype>
std::ifstream file("file.txt");
std::string line;
std::vector<int> x,y,z;
while (std::getline(file, line)) {
int a, b, c;
std::istringstream ss(line);
// read three ints from the stream and see if it succeeds
if (!(ss >> a >> b >> c)) {
// error non-int or not enough ints on the line
break;
}
// we read three ints, now we ignore any trailing whitespace
// characters and see if we reached the end of line
while (isspace(ss.peek()) ss.ignore();
if (ss.get() != EOF) {
// error, there are more characters on the line
break;
}
// everything's fine
x.push_back(a);
y.push_back(b);
z.push_back(c);
}