如果字符串不超过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上运行,而且必须更复杂......再次 - 对初学者来说不好。
答案 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指针。