我有一个像这样结构的文本文件:
G 15324 2353
D 23444
Q 23433 32565
我想将每条信息存储到一个变量中并将其包含在一个向量中:
ifstream fin;
fin.open("file.txt");
vector<SomeClass> test;
SomeClass temp;
while (fin >> temp.code >> temp.datapoint>> temp.dataleague)
{
test.push_back(temp);
}
但是,在文件中有时会省略第三个值( temp.dataleague )并将其留空。显然,上面的代码不起作用,因为它只会在该字段中放入垃圾。如果不确定第三个字段是否包含值,我该怎么做呢?
答案 0 :(得分:0)
您可以尝试使用:
std::istream::getline
这将允许您将每行放入缓冲区,然后根据需要进行处理。
char buffer[256];
fin.getline(buffer,256);
然后,您可以使用以下方法解析不同的字段:
std::string line = std::string(buffer);
int index = line.find(' ');
if (index>0)
std::cout << "My value is: " << line.substr(0,index);
以你为例:
ifstream fin;
fin.open("file.txt");
vector<SomeClass> test;
SomeClass temp;
char buffer[256];
while (!fin.eof())
{
fin.getline(buffer,256);
auto line = std::string(buffer);
std::vector<std::string> tokens;
int start = 0, end = line.find(' ');
while (end!=-1)
{
tokens.push_back(line.substr(start,end-1));
start = end +1;
end = line.find(' ');
}
if (start<line.size())
tokens.push_back(line.substr(start));
if (tokens.size()==3)
{
test.code = tokens[0];
test.datapoint= tokens[1];
test.dataleague= tokens[2];
test.push_back(temp);
}
}
答案 1 :(得分:0)
也许是这样的。阅读整行,然后在已知分隔符上解析它(&#39;&#39;)。一旦你知道线上有多少项,就可以使用istringstream以预期的方式将它们拉出来。
#include <sstream>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
ifstream fin("file.txt");
vector<SomeClass> test;
string line;
while (getline(fin, line))
{
istringstream iss(line);
char code = 'X';
int datapoint = 99999, dataleague = 99999;
size_t n = count(line.begin(), line.end(), ' ');
if (n == 0) iss >> code;
else if (n == 1) iss >> code >> datapoint;
else if (n == 2) iss >> code >> datapoint >> dataleague;
SomeClass temp(code, datapoint, dataleague);
test.push_back(temp);
}
return 0;
}