在C ++中读取常量字符数

时间:2011-10-06 18:22:49

标签: c++ string spaces istream

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

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

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

我可以使用 istream :: get istream :: 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上运行,而且必须更复杂......再次 - 对初学者来说不好。

2 个答案:

答案 0 :(得分: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个字符,你怎么知道什么时候到达字符串的末尾?

答案 1 :(得分: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指针。