我正在尝试做一项家庭工作任务,要求将txt文件中的数据读入变量。该文件在每行“姓氏,姓名缩写,数字,数字”上都有此字样。我已经使用以下代码部分地使用了get行。
ifstream inputFile("Students.txt");
string line;
string Surname;
string Initial;
int number1, number2;
while (getline(inputFile, line))
{
stringstream linestream(line);
getline(linestream, Surname, ',');
getline(linestream, Initial, ',');
getline(linestream, number1, ',');
getline(linestream, number2, ',');
cout << Surname << "---" << Initial << "-" << number1 << "-" << number2 << endl;
}
这会引发编译错误,但如果我将number1和number2声明为字符串,则可以正常工作。所以我的问题是,我是否必须将getline作为字符串然后转换为int变量或者是否有更好的方法?
答案 0 :(得分:4)
是的,getline函数的第二个参数必须是一个字符串,它将包含你提取的字符串。只需将number1和number2声明为字符串,然后使用stoi()(C ++ 11)或atoi()函数将它们转换为Integer:
string strNumber1;
string strNumber2;
getline(linestream, strNumber1, ',');
getline(linestream, strNumber2, ',');
int number1 = stoi(strNumber1);
int number2 = atoi(strNumber2.c_str());
希望这有帮助
答案 1 :(得分:0)
std::getline
将std::basic_istream
的对象作为第一个参数。它不适用于任何其他对象。
我所做的是使用csv_whitespace
类将逗号添加为分隔符。例如:
class csv_whitespace
: public std::ctype<char>
{
public:
static const mask* make_table()
{
static std::vector<mask> v(classic_table(), classic_table() + table_size);
v[','] |= space;
v[' '] |= space;
return &v[0];
}
csv_whitespace(std::size_t refs = 0) : ctype(make_table(), false, refs) { }
};
int main()
{
std::ifstream in("Students.txt");
std::string line;
std::string surname;
std::string initial;
int number1, number2;
while (std::getline(in, line))
{
std::stringstream linestream(line);
linestream.imbue(std::locale(linestream.getloc(), new csv_whitespace));
getline(linestream, surname, ',');
getline(linestream, initial, ',');
linestream >> number1 >> number2;
}
}