我想从文件
中读取这样的输入球体3 2 3 4
金字塔2 3 4 12 3 5 6 7 3 2 4 1 2 3
矩形2 3 4 1 9 12
我想做这样的事情
char name[64];
int arr[12];
ifstream file (..);
while(file)
{
file >> name;
while( //reach end of line)
file >> arr[i]
}
正如您所看到的,我不知道将输入多少整数,这就是我想要停在新线上的原因。我用getline完成了它,然后拆分线,但是他们告诉我只能用>>来完成它。操作
注意:我无法使用std::string
或std::vector
。
答案 0 :(得分:3)
简单版本是使用类似于std::ws
的操纵符,而不是在遇到换行符时跳过所有空格设置std::ios_base::failbit
。然后将使用此操纵器而不是隐式跳过空格,而不是跳过新行。例如(代码不是测试,但我认为这样的事情,删除了错误和编译错误应该有效):
std::istream& my_ws(std::istream& in) {
std::istream::sentry kerberos(in);
while (isspace(in.peek())) {
if (in.get() == '\n') {
in.setstate(std::ios_base::failbit);
}
}
return in;
}
// ...
char name[64];
int array[12];
while (in >> std::setw(sizeof(name)) >> name) { // see (*) below
int* it = std::begin(array), end = std::end(array);
while (it != end && in >> my_ws >> *it) {
++it;
}
if (it != end && in) { deal_with_the_array_being_full(); }
else {
do_something_with_the_data(std::begin(array), it);
if (!in.eof()) { in.clear(); }
}
}
我的个人猜测是,作业要求将值读入char
数组,然后使用atoi()
或strol()
进行转换。我认为这对练习来说是一个无聊的解决方案。
(*)从不,即使在exmaple代码中,也请使用格式化的输入运算符与char
数组array
,不用也设置允许的最大尺寸!可以通过设置流的width()
来设置大小,例如,使用操纵器std::setw(sizeof(array))
。如果使用带有width()
数组的格式化输入运算符时0
为char
,则会读取任意数量的非空白字符。这可以轻松溢出阵列并成为安全问题!从本质上讲,这是拼写C gets()
的C ++方式(现在从C和C ++标准库中删除)。
答案 1 :(得分:1)
我想您可以使用peek方法:
while (file)
{
file >> name;
int i = 0;
while(file.peek() != '\n' && file.peek() != EOF) {
file >> arr[i++];
}
}