-1

如果字符串不超过 20 个字符并且在 C++ 中可以包含空格,您将如何读取它?例如我有这种文件:

3
Namama               4 5 12
Cool                 4 2 34
Not So Cool          4 2 45

我想用最基本的方式来写它。在这种情况下,我宁愿只使用 C++(没有 C 的东西)。这意味着我想将它存储在 std::string 中。

我可以使用istream::getistream::getline但我必须避免使用换行符。这是有问题的(我正在编写的代码将向初学者展示)。

你对这个问题有什么解决方案?

编辑:

如被问及,我将告诉您我尝试过的方法,但我认为这不会有任何好处。我不是 C++ 初学者,通常我会使用istream::get和 char 数组之类的东西,但是对于某些人来说,删除换行符可能看起来太技术了。

所以......使用istream::operator>>读取 char 数组或std::string失败,因为当他们看到空格字符时它会停止读取(我可能必须阅读几个单词)。这意味着以下代码失败:

char name[21];
std::cin >> name;

或者...

std::string name;
std::cin >> name;

另一件事是换行符因系统而异,实际上 Windows 默认使用其中两个,我尝试在 Windows 上使用istream::ignore和 2 作为参数,这是忽略新行的唯一方法,我得出的结论是,这是因为 Windows 使用两个字符作为换行符。这意味着它不能在 Linux 上运行,而且它必须更复杂......再次 - 对初学者不利。

4

2 回答 2

2

如果您想准确读取20 个字符,

for(int i=0; i<3; ++i) {
    std::string result;
    int one, two, three;

    result.resize(20);
    if (!std::cin.read(&result[0], 20)) throw std::runtime_error("reading buffer failed!");

    if (!std::cin >> one >> two >> three) throw std::runtime_error("reading numbers failed!");
    if (!std::cin.ignore(1000, '\n')) throw std::runtime_error("ignore failed!");
}

如果你不想要正好 20 个字符,你怎么知道你什么时候到达了字符串的末尾?

于 2011-10-06T18:35:17.877 回答
0

实现此目的的一种方法是使用 istream::read 进入足够大小的临时缓冲区,然后使用该缓冲区初始化 std::string。

char name[21];
std::cin.read(name, 20);
std::string nameString(name); // If you want it in a std::string

这正好读取 20 个字符、换行符和所有内容。如果是为了锻炼,那么这至少非常简单。如果您有时需要少于 20 个字符,则可以通过 std::istream::unget 或等效项确定读取了多少额外字符并返回 get 指针。

于 2011-10-06T19:04:43.013 回答