Cin 来自 stdin,当它是他的一行的结尾

Cin from stdin when it his the end of a line

本文关键字:结尾 一行 stdin 来自 Cin      更新时间:2023-10-16

例如我有一个文件

M
4
2
//comments
.#..

它通过标准提供给程序。我不能使用fstream,只能使用iostream。

如果我想逐个角色地阅读整件事,我可以做到吗?

char first_letter, first_num, second_num;
cin >> first_letter;
cin >> first_num;
cin >> second_num;

还是会把队伍的尽头搞砸?例如,cin 在读取 M 表示 first_letter 后是否知道它需要转到终点行?

其次,我不想阅读评论行。我的计划是,如果我看到一个/,我将使用getline来"垃圾"该行,然后移动到.# ..并将它们存储在我的数组中。这是最好的方法吗?

首先,默认情况会跳过空格(空格、制表符、换行符),因此该部分很容易。

现在,关于评论行,这有点复杂。您可以使用 std::getline() 读取一行。这会将行存储在字符串中并丢弃尾随换行符。但是,例如,如果您读取上面代码中的第一个字母,换行符将保留在流中,因此 getline() 将读取一个空字符串。简而言之,不要混合基于行的输入和基于令牌的输入。

在实践中,您读取一行并手动解析它,或者为此创建一个流:

while(getline(in, line)) {
    if(line.empty()) continue; // empty line
    if(line[0] == '#') continue; // comment line
    // parse line
    std::stringstream s(line);
    char c;
    s >> c;
}