我想从文件中获取一些数据并将其放入变量中。但之前,我不知道这个文件的长度。文件看起来像:
1 12 4
2 14 5
3 26 6
. .. .
这就是为什么我想要了解一些行,我需要在循环中创建多少变量。在这段代码中,我创建了3个变量(a,b,c)来尝试。问题是在程序结束后a,b,c只是随机数而不是1,12和4。 我注意到,如果我这样说:
在while循环之前file>> a>> b>> ℃;
它可以工作,但我需要更早的行数。
那么如何计算不使用getline()
的行?
int a, b, c;
fstream file;
file.open("abc.txt",ios::in);
if (file.good() == true)
{
int lines_amount=0;
string test;
while (getline(file,test))
{
lines_amount++;
}
file >> a >> b >> c;
file.close();
}
答案 0 :(得分:2)
倒带文件指示器怎么样?
file.seekg(std::ifstream::beg);
在之前的while
循环中,整个文件已被阅读,因此下一次阅读没有任何内容,a
,b
和{{1保持不变。在此代码之后,文件指示符将重置为文件的开头,因此您可以重新开始阅读。
在调用c
之前,您可能需要添加file.clear()
以清除已设置的任何标志,以防止进一步的操作失败。如果设置了坏旗,他们中的大多数都不会做任何事情。在您的情况下,当尝试阅读更多内容时,seekg()
函数会找到错误标记(operator >> ()
)并停止。 Further Reference
答案 1 :(得分:2)
使用时
import { clearInterval } from 'timers';
while (getline(file,test))
{
lines_amount++;
}
循环仅在读取文件中的所有内容后停止。这条线
while
不会将任何内容读入file >> a >> b >> c;
,a
或b
。这些变量的值是您获得的一些随机值,因为它们之前尚未初始化。
将它们初始化为:
c
你会注意到:
为了能够从文件的开头读取数字,请将其倒回到顶部。您可以使用int a = 10, b = 20, c = 30;
。您必须首先清除其std::ifstream::seekg
。
eofbit
答案 2 :(得分:0)
这就是为什么我想知道多少行,我需要在循环中创建多少变量。
您不需要事先了解行数。使用std::vector
存储值,并在向其中添加值时动态增长。例如:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
struct values {
int a, b, c;
};
std::vector<values> data;
std::ifstream file("abc.txt");
if (file.is_open()) {
std::string line;
while (std::getline(file, line)) {
std::istringstream iss(line);
values v;
if (iss >> v.a >> v.b >> v.c) {
data.push_back(v);
}
}
file.close();
// use data as needed...
}
可替换地:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
struct values {
int a, b, c;
};
std::istream& operator>>(std::istream &in, values &v) {
std::string line;
if (std::getline(in, line)) {
std::istringstream iss(line);
if (!(iss >> v.a >> v.b >> v.c)) {
in.setstate(std::ios_base::failbit);
}
}
return in;
}
std::vector<values> data;
ifstream file("abc.txt");
if (file.is_open()) {
std::copy(
std::istream_iterator<values>(file),
std::istream_iterator<values>(),
std::back_inserter(data));
file.close();
// use data as needed...
}