c ++如何读取流直到行尾

时间:2016-06-07 21:50:24

标签: c++ istream

我想从文件

中读取这样的输入
  

球体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::stringstd::vector

2 个答案:

答案 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()数组的格式化输入运算符时0char,则会读取任意数量的非空白字符。这可以轻松溢出阵列并成为安全问题!从本质上讲,这是拼写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++];
    }
}